numpy中数组操作的混乱

2 python matlab numpy

我一般使用MATLABOctave,我最近切换到python numpy.在我定义像这样的数组时numpy

>>> a = np.array([[2,3],[4,5]])
Run Code Online (Sandbox Code Playgroud)

它工作得很好,阵列的大小是

>>> a.shape
(2, 2)
Run Code Online (Sandbox Code Playgroud)

这与MATLAB相同但是当我提取第一个整列并查看大小时

>>> b = a[:,0]
>>> b.shape
(2,)
Run Code Online (Sandbox Code Playgroud)

我得到大小(2,),这是什么?我希望它的大小(2,1).也许我误解了这个基本概念.任何人都可以让我明白这个?

ali*_*i_m 7

1D numpy数组*实际上是1D - 它在任何第二维中都没有大小,而在MATLAB中,'1D'数组实际上是2D,其第二维的大小为1.

如果您希望阵列的第二维尺寸为1,则可以使用其.reshape()方法:

a = np.zeros(5,)
print(a.shape)
# (5,)

# explicitly reshape to (5, 1)
print(a.reshape(5, 1).shape)
# (5, 1)

# or use -1 in the first dimension, so that its size in that dimension is 
# inferred from its total length
print(a.reshape(-1, 1).shape)
# (5, 1)
Run Code Online (Sandbox Code Playgroud)

编辑

正如Akavall指出的那样,我还应该提到np.newaxis另一种向数组添加新轴的方法.虽然我个人觉得有点不太直观的一个优势np.newaxis.reshape()的是,它可以让你以任意顺序添加多个新的轴没有明确指定输出数组,这是不可能的形状.reshape(-1, ...)伎俩:

a = np.zeros((3, 4, 5))
print(a[np.newaxis, :, np.newaxis, ..., np.newaxis].shape)
# (1, 3, 1, 4, 5, 1)
Run Code Online (Sandbox Code Playgroud)

np.newaxis只是一个别名None,所以你可以做一些更紧凑的使用相同的东西a[None, :, None, ..., None].


*np.matrix另一方面,An 始终是2D,它将为您提供MATLAB中熟悉的索引行为:

a = np.matrix([[2, 3], [4, 5]])
print(a[:, 0].shape)
# (2, 1)
Run Code Online (Sandbox Code Playgroud)

有关数组和矩阵之间差异的更多信息,请参见此处.

  • `a [:,np.newaxis]`是另一种添加轴的方法,我不知道它是否比`reshape`更好,但只是想指出它. (2认同)