python - numpy 作者如何决定是否将函数放入 numpy.* 与 numpy.ndarray.* 中?
问题描述
我觉得我在这里错过了一些统一的主题。有几个观察结果我在上下文中遇到了麻烦。
flatten() 在 numpy.ndarray.* 中,但是 flatten() 实际上是不合适的,这对我来说似乎有点奇怪,因为它是一个对象方法,而不是一个库函数。
那么,如果允许对象方法返回副本,那么为什么 np.repeat() (不合适)不仅仅是 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
通常产生 a view
,而不是 a copy
。
的实际代码np.ravel
是:
if isinstance(a, np.matrix):
return asarray(a).ravel(order=order)
else:
return asanyarray(a).ravel(order=order)
如果参数不是数组,则将其转换为一个。然后使用该方法。
这种模式很常见。该函数asarray
在需要时执行一个操作,然后将操作委托给该方法。
np.reshape
并x.reshape
遵循这个模式。有一种x.shape=...
形式是真正的in-place
行动。他们尽可能返回 a view
(他们不会改变元素的总数)。这view
共享数据,但有自己的shape
和strides
.
resize
是两者之间有显着差异的函数/方法对之一。我们用的不多。
repeat
功能与方法相同。因为它通常会更改元素的数量,所以repeat
(两种形式)都会返回一个带有自己数据的新数组。它不返回view
.
sum
是另一个返回新数组的对。它改变了元素的数量,所以 aview
是不可能的。
至于randn
,它的文档解释了差异。将形状指定为元组可能是首选的“标准”,但这种randn
行为是不寻常的。新代码的建议替代方案standard_normal
采用size
元组。reshape
接受任何一个。
虽然正常的元组语法是(1,2,3)
,但()
实际上是可选的;它是标记元组的逗号。它在 1 元素元组中是必需的,例如。(1,)
. 在索引中x[(1,2)]
和x[1,2]
是相同的,将 a 传递tuple
给x.__getitem__
.
python和pythonnumpy
都有悠久的历史。过去做出的选择现在仍然以一种或另一种方式与我们同在。提炼代码很慢;添加功能比删除它们更容易。
推荐阅读
- diagram - 如何打开 .NVG-CHT-BIN 文件
- laravel - Laravel:我正在为我的数据库中的每个治疗师添加一个专业,这会显示出来。为什么?
- xcode9 - 升级到“Xcode 10”,现在我的源代码编辑器扩展不显示在编辑器菜单下
- optimization - 在 AMPL 中支持“或”和“计数”约束的优化器
- javascript - 使用 redux 循环调用多个 api
- scala - 具有多个相同模式的流畅代码生成
- c# - 在 Visual Studio 2017 中更改表单名称发生许多错误
- python - TensorFlow:TensorFlow 中的多次前向传递
- android - 如何防止标记在集群管理器中重复?
- php - 在 laravel 中的模型上使用 current() 函数