我觉得这里缺少了一些统一的主题。有几个观察结果我很难理解上下文。
-
flatn((在numpy.ndarray.*中,但flatn(实际上不合适,这对我来说有点奇怪,因为它是一个对象方法,而不是一个库函数。
-
那么,如果允许对象方法返回副本,那么为什么np.rerepeat(((不合时宜(不仅仅是np.ndarray.*中的对象方法呢?
-
另一方面,非对象方法numpy.reshape已经到位。。。这种趋势似乎与我的预期有点相反。
-
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
只有在需要时才制作。
根据您的术语,flatten
是out-of-place
,ravel
不是。或者在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
共享数据,但具有自己的shape
和strides
。
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]
是相同的,传递一个tuple
到x.__getitem__
。
python和numpy
都有着悠久的历史。过去做出的选择现在仍以某种方式与我们同在。细化代码很慢;添加功能比删除功能更容易。