对于其基数组类,2d数组并不比1d或3d数组更特殊。有些操作保留维度,有些操作减少维度,有些操作合并甚至扩展维度。
M=np.arange(9).reshape(3,3)
M[:,0].shape # (3,) selects one column, returns a 1d array
M[0,:].shape # same, one row, 1d array
M[:,[0]].shape # (3,1), index with a list (or array), returns 2d
M[:,[0,1]].shape # (3,2)
In [20]: np.dot(M[:,0].reshape(3,1),np.ones((1,3)))
Out[20]:
array([[ 0., 0., 0.],
[ 3., 3., 3.],
[ 6., 6., 6.]])
In [21]: np.dot(M[:,[0]],np.ones((1,3)))
Out[21]:
array([[ 0., 0., 0.],
[ 3., 3., 3.],
[ 6., 6., 6.]])
给出相同数组的其他表达式
np.dot(M[:,0][:,np.newaxis],np.ones((1,3)))
np.dot(np.atleast_2d(M[:,0]).T,np.ones((1,3)))
np.einsum('i,j',M[:,0],np.ones((3)))
M1=M[:,0]; R=np.ones((3)); np.dot(M1[:,None], R[None,:])
MATLAB从2D数组开始。新版本允许更多维度,但保留了2的下界。但是你还是要注意行矩阵和列矩阵之间的区别,列矩阵的形状是(1,3)v (3,1)你多久写一次[1,2,3]?我要写行向量和列向量,但是有了二维的约束,在MATLAB中没有任何向量至少在数学意义上的向量是一维的。
你看过np吗?至少2d(也_1d和_3d版本)?
在新的Python/numpy中,有一个matmul操作符
In [358]: M[:,0,np.newaxis]@np.ones((1,3))
Out[358]:
array([[0., 0., 0.],
[3., 3., 3.],
[6., 6., 6.]])
在numpy中,元素乘法在某种意义上比矩阵乘法更基本。对于大小为1的积和,不需要使用dot/matmul:
In [360]: M[:,0,np.newaxis]*np.ones((1,3))
Out[360]:
array([[0., 0., 0.],
[3., 3., 3.],
[6., 6., 6.]])
它使用广播,这是numpy一直拥有的强大功能。MATLAB最近才添加了它。