numpy数组重塑返回一个新数组,而不是重新整形。任何设计理由?

时间:2017-05-25 19:36:59

标签: python arrays numpy

a = np.zeros(3)
print a.reshape((3,1))
print a
  

[[0.]   [0.]   [0。]]

     

[0. 0. 0。]

a.reshape不会改变a的形状,这有点违反直觉。这有什么设计理由吗?

非常感谢。

2 个答案:

答案 0 :(得分:3)

虽然实际上可以更改数组对象的形状而不是创建重新整形的视图,但实际上您几乎从不需要这样做,并且相对于制作视图几乎没有性能差异。

制作视图可以降低您将某个其他代码所需的对象形状变异的风险,并且可以避免在常见情况下编写a[:].reshape(...)而不是a.reshape(...)你还需要原始阵列的原始阵列。

NumPy中几乎没有任何形状操纵工具会修改对象的形状,但如果你真的想这样做,只要步幅有效,你就可以:

a.shape = (3, 1)

答案 1 :(得分:0)

我经常使用reshape制作测试数组,如下所示:

In [180]: x = np.arange(6).reshape(2,3)
In [181]: x
Out[181]: 
array([[0, 1, 2],
       [3, 4, 5]])

现场替代方案是:

In [182]: x = np.arange(6); x.shape = (2,3)
In [183]: x
Out[183]: 
array([[0, 1, 2],
       [3, 4, 5]])

我很少使用inplace方法,我几乎忘记它在那里。实际上,很难想到常见的现场操作。

In [185]: x.fill(0)
In [186]: x
Out[186]: 
array([[0, 0, 0],
       [0, 0, 0]])

x.reshape外,还有np.reshape(x)。那是/numpy/core/fromnumeric.pyfromnumeric表示它是numeric包的一部分,numpy的前身。所以这种方法可以追溯到时间。

此外,shape=更具限制性。

In [195]: xt = x.T
In [196]: xt.shape
Out[196]: (3, 2)
In [197]: xt.shape=(2,3)
...
AttributeError: incompatible shape for a non-contiguous array

因为转置重新整形,并且改变顺序(到'F'),所以不能重新整形会对底层数据进行暴力。 xt.reshape(2,3)最终制作副本,而不是视图。