numpy作者如何决定是否将函数放在numpy.*与numpy.ndarray.*中



我觉得这里缺少了一些统一的主题。有几个观察结果我很难理解上下文。

  1. flatn((在numpy.ndarray.*中,但flatn(实际上不合适,这对我来说有点奇怪,因为它是一个对象方法,而不是一个库函数。

  2. 那么,如果允许对象方法返回副本,那么为什么np.rerepeat(((不合时宜(不仅仅是np.ndarray.*中的对象方法呢?

  3. 另一方面,非对象方法numpy.reshape已经到位。。。这种趋势似乎与我的预期有点相反。

  4. np.random.randn((为要生成的数组的维度获取多个位置参数,而np.zeros则获取包含维度的单个位置参数元组。这是有原因的吗?

我只想了解导致这些选择的设计决策,这样我就不会在调用这些函数时重复犯愚蠢的错误。

谢谢。

In [495]: x = np.arange(12).reshape(3,4)      # reshape((3,4)) also                                                         
In [496]: x.flatten?                                                                                   
Docstring:
a.flatten(order='C')
Return a copy of the array collapsed into one dimension.

ravel方法和功能"等价":

In [497]: x.ravel?                                                                                     
Docstring:
a.ravel([order])
Return a flattened array.
Signature: np.ravel(a, order='C')
Docstring:
Return a contiguous flattened array.
A 1-D array, containing the elements of the input, is returned.  A copy is

只有在需要时才制作。

根据您的术语,flattenout-of-placeravel不是。或者在numpy's项中,ravel通常产生view,而不是copy

np.ravel的实际代码为:

if isinstance(a, np.matrix):
return asarray(a).ravel(order=order)
else:
return asanyarray(a).ravel(order=order)

如果参数不是数组,则将其转换为一个数组。然后使用该方法。

这种模式很常见。如果需要,函数执行asarray,然后将操作委派给方法。

CCD_ 11和CCD_。有一个x.shape=...形式是一个真正的in-place动作。在可能的情况下,它们返回一个view(它们不会更改元素的总数(。该view共享数据,但具有自己的shapestrides

CCD_ 19是两者之间具有显著差异的函数/方法对之一。我们用得不多。

repeat函数与方法相同。因为repeat(两种形式(通常会更改元素的数量,所以它会返回一个带有自己数据的新数组。它不返回view

CCD_ 23是返回新数组的另一对。它会更改元素的数量,因此view是不可能的。

至于randn,它的文档解释了差异。将形状指定为元组可能是首选的"标准",但这种randn行为并不常见。新代码standard_normal的建议替代方案采用size元组。reshape接受任一项。

虽然正常的元组语法是(1,2,3),但()实际上是可选的;标记元组的是逗号。它在一个1元素元组中是必需的,例如(1,)。在索引中,x[(1,2)]x[1,2]是相同的,传递一个tuplex.__getitem__

python和numpy都有着悠久的历史。过去做出的选择现在仍以某种方式与我们同在。细化代码很慢;添加功能比删除功能更容易。

最新更新