numpy为什么有许多ndarray方法的相应函数?

Rob*_*rto 12 python arrays methods numpy built-in

几个例子:

numpy.sum()
ndarray.sum()
numpy.amax()
ndarray.max()
numpy.dot()
ndarray.dot()
Run Code Online (Sandbox Code Playgroud)

......还有更多.它是支持一些遗留代码,还是有更好的理由?而且,我是根据我的代码"看起来"的方式选择的,还是两种方式中的一种比另一种更好?

我可以想象一个人可能想要numpy.dot()使用reduce(例如reduce(numpy.dot, A, B, C, D)),但我不认为这对于类似的东西会有用numpy.sum().

Ale*_*ley 11

正如其他人所指出的那样,同名的NumPy函数和数组方法通常是等价的(它们最终会调用相同的底层代码).如果它使阅读更容易,则可能优先于另一个.

但是,在某些情况下,两者的行为略有不同.特别是,使用该ndarray方法有时会强调该方法正在修改阵列的事实.

例如,np.resize返回具有指定形状的数组.另一方面,ndarray.resize就地改变阵列的形状.每种情况下使用的填充值也不同.

同样,a.sort()对数组a进行就地np.sort(a)排序,同时返回已排序的副本.


hpa*_*ulj 5

在大多数情况下,该方法是基本的编译版本.该函数在可用时使用该方法,但在参数不是数组时也具有某种备份.它有助于查看函数或方法的代码和/或文档.

例如,如果在Ipython我要求查看sum方法的代码,我看到它是编译代码

In [711]: x.sum??
Type:        builtin_function_or_method
String form: <built-in method sum of numpy.ndarray object at 0xac1bce0>
...
Refer to `numpy.sum` for full documentation.
Run Code Online (Sandbox Code Playgroud)

np.sum我获得许多文档和一些Python代码时也这样做:

   if isinstance(a, _gentype):
        res = _sum_(a)
        if out is not None:
            out[...] = res
            return out
        return res
    elif type(a) is not mu.ndarray:
        try:
            sum = a.sum
        except AttributeError:
            return _methods._sum(a, axis=axis, dtype=dtype,
                                out=out, keepdims=keepdims)
        # NOTE: Dropping the keepdims parameters here...
        return sum(axis=axis, dtype=dtype, out=out)
    else:
        return _methods._sum(a, axis=axis, dtype=dtype,
                            out=out, keepdims=keepdims)
Run Code Online (Sandbox Code Playgroud)

如果我把np.sum(x)这里x是一个数组,它最终调用x.sum():

    sum = a.sum
    return sum(axis=axis, dtype=dtype, out=out)
Run Code Online (Sandbox Code Playgroud)

np.amax相似(但更简单).请注意,np.表单可以处理不是数组的对象(没有该方法),例如list : np.amax([1,2,3]).

np.dot并且x.dot都显示为"内置"功能,所以我们不能说优先级.他们可能最终都会调用一些底层的C函数.

np.reshape 是另一个可能的分歧:

try:
    reshape = a.reshape
except AttributeError:
    return _wrapit(a, 'reshape', newshape, order=order)
return reshape(newshape, order=order)
Run Code Online (Sandbox Code Playgroud)

因此np.reshape(x,(2,3))功能相同x.reshape((2,3)).但_wrapit表达式可以实现np.reshape([1,2,3,4],(2,2)).

np.sort 通过对副本执行就地排序来返回副本:

a = asanyarray(a).copy()
a.sort(axis, kind, order)
return a
Run Code Online (Sandbox Code Playgroud)

x.resize是内置的,而np.resize最终做了一个np.concatenatereshape.

如果您的数组是子类,如矩阵或蒙版,它可能有自己的变体.矩阵的作用.sum是:

return N.ndarray.sum(self, axis, dtype, out, keepdims=True)._collapse(axis)
Run Code Online (Sandbox Code Playgroud)

  • 关于ipython中的`??`的TIL (3认同)