有几件事是不同的。在numpy
数组可以是 0d 或 1d 或更高。在 MATLAB 中,2d 是最小的(并且一度是唯一的维度)。 MATLAB 很容易扩展末端的维度,因为它是Fortran ordered
. numpy
, 默认情况下c ordered
,并且最容易扩大前面的尺寸。
In [1]: A = np.zeros([5,3])
In [2]: A[:,0].shape
Out[2]: (5,)
简单的索引会减少维度,无论它是否A[0,:]
or A[:,0]
。与 3d MATLAB 矩阵相比,A(1,:,:)
v A(:,:,1)
.
numpy
does broadcasting
,在求和和赋值等操作期间调整维度。一个基本规则是,如果需要,维度可以自动扩展到一开始:
In [3]: A[:,0] = np.ones(5)
In [4]: A[:,0] = np.ones([1,5])
In [5]: A[:,0] = np.ones([5,1])
...
ValueError: could not broadcast input array from shape (5,1) into shape (5)
它可以改变(5,)
LHS 为 (1,5),但无法将其更改为 (5,1)。
另一个广播示例,+
:
In [6]: A[:,0] + np.ones(5);
In [7]: A[:,0] + np.ones([1,5]);
In [8]: A[:,0] + np.ones([5,1]);
现在 (5,) 与 (5,1) 一起工作,但那是因为它变成了 (1,5),它与 (5,1) 一起产生 (5,5) - 一个外积广播:
In [9]: (A[:,0] + np.ones([5,1])).shape
Out[9]: (5, 5)
八度音程
>> x = ones(2,3,4);
>> size(x(1,:,:))
ans =
1 3 4
>> size(x(:,:,1))
ans =
2 3
>> size(x(:,1,1) )
ans =
2 1
>> size(x(1,1,:) )
ans =
1 1 4
要完成您想要的作业,请调整任一侧
以保留维数的方式建立索引:
In [11]: A[:,[0]].shape
Out[11]: (5, 1)
In [12]: A[:,[0]] = np.ones([5,1])
将 (5,1) 转置为 (1,5):
In [13]: A[:,0] = np.ones([5,1]).T
将 (5,1) 展平/拆解为 (5,):
In [14]: A[:,0] = np.ones([5,1]).flat
In [15]: A[:,0] = np.ones([5,1])[:,0]
squeeze
, ravel
也工作。
Octave 中的一些快速测试表明,它在尺寸不匹配方面更加宽容。但是numpy
优先考虑一致性。一旦理解了广播规则,行为就有意义了。