2

我通常使用MATLABand Octave,我最近切换到python numpy. 在 numpy 中,当我定义这样的数组时

>>> a = np.array([[2,3],[4,5]])

它工作得很好,数组的大小是

>>> a.shape
(2, 2)

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

>>> b = a[:,0]
>>> b.shape
(2,)

我得到尺寸(2,),这是什么?我希望大小为(2,1). 也许我误解了基本概念。任何人都可以让我清楚这一点吗?

4

2 回答 2

7

一维 numpy 数组* 实际上是一维的 - 它在任何第二维中都没有大小,而在 MATLAB 中,“一维”数组实际上是二维的,其第二维的大小为 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)

编辑

正如 Akavall 所指出的,我还应该提到np.newaxis将新轴添加到数组的另一种方法。虽然我个人觉得它不太直观,但np.newaxisover的一个优点.reshape()是它允许您以任意顺序添加多个新轴,而无需显式指定输出数组的形状,这是使用.reshape(-1, ...)技巧无法实现的:

a = np.zeros((3, 4, 5))
print(a[np.newaxis, :, np.newaxis, ..., np.newaxis].shape)
# (1, 3, 1, 4, 5, 1)

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)

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

于 2013-06-17T02:11:06.620 回答
2

打字help(np.shape)可以让您深入了解这里发生的事情。对于初学者,您可以通过键入以下内容获得您期望的输出:

b = np.array([a[:,0]])

基本上 numpy 定义的东西与 MATLAB 略有不同。在numpy环境下,向量只有一维,而数组是向量的向量,所以它可以有更多。在您的第一个示例中,您的数组是两个向量的向量,即:

a = np.array([[vec1], [vec2]])

所以a有两个维度,在您的示例中,两个维度中的元素数量相同,为 2。因此,您的数组是 2 x 2。当您从中取出切片时,您将拥有的维度数量减少一。换句话说,您从数组中取出一个向量,该向量只有一维,也有 2 个元素,仅此而已。您的向量现在是 2 by _。第二个位置没有任何内容,因为那里没有定义向量。

你也可以从空间的角度来考虑它。你的第一个数组在空间中R^(2x2),你的第二个向量在空间中R^(2)。这意味着数组是在与向量不同(且更大)的空间上定义的。

基本上可以说您从数组中取出了一个切片,并且与 MATLAB 不同,numpy 表示向量(一维)的方式与它表示数组(2 维或更多维)的方式不同。

于 2013-06-17T02:07:58.020 回答