numpy中数组操作的混乱

时间:2013-06-17 01:57:17

标签: python matlab numpy

我通常使用MATLABOctave,我最近切换到python numpy。 在我定义像这样的数组

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

效果很好,数组的大小是

>>> a.shape
(2, 2)

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

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

我得到尺寸(2,),这是什么?我希望大小为(2,1)。也许我误解了这个基本概念。谁能让我清楚这个?

2 个答案:

答案 0 :(得分:8)

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)

修改

正如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)

np.newaxis只是None的别名,因此您可以使用a[None, :, None, ..., None]更紧凑地执行同样的操作。


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

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

有关数组和矩阵之间差异的更多信息,请参阅here

答案 1 :(得分:3)

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

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

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

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

因此a有两个维度,在您的示例中,两个维度中的元素数量相同,2。因此,您的数组是2乘2.当您从中获取切片时,您正在减少您拥有的维度数量。换句话说,你从数组中取出一个向量,并且该向量只有一个维度,它也有2个元素,但就是这样。您的矢量现在是 _ 2。第二个点没有任何内容,因为那里没有定义矢量。

你也可以用空格来思考它。您的第一个数组位于空格R^(2x2)中,而您的第二个数组位于空格R^(2)中。这意味着数组定义在与向量不同(且更大)的空间上。

基本上说你从阵列中取出了一个切片,并且与MATLAB不同,numpy并不像数组(2维或更多维)那样表示向量(1维)。

相关问题