a = np.zeros(3)
print a.reshape((3,1))
print a
[[0.] [0.] [0。]]
[0. 0. 0。]
a.reshape不会改变a的形状,这有点违反直觉。这有什么设计理由吗?
非常感谢。
答案 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.py
。 fromnumeric
表示它是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)
最终制作副本,而不是视图。