python numpy中数组运算的混乱

cczfrluj  于 2022-12-28  发布在  Python
关注(0)|答案(2)|浏览(152)

我通常使用MATLABOctave,最近我改用pythonnumpy。在numpy中,当我定义这样的数组时

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

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

>>> a.shape
(2, 2)

这和MATLAB是一样的但是当我提取第一整列并查看大小时

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

我得到(2,)的大小,这是什么?我期望的大小是(2,1)。也许我误解了基本概念。有人能让我清楚这一点吗?

njthzxwz

njthzxwz1#

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)

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

4dc9hkyq

4dc9hkyq2#

输入help(np.shape)可以让你对这里发生的事情有一些了解,对于初学者来说,你可以通过输入以下命令得到你想要的输出:

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

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

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

所以a有两个维度,在你的例子中,两个维度的元素数是一样的,都是2,所以你的数组是2乘2,当你从这个数组中取出一个切片时,你的维度数减少了一,换句话说,你从数组中取出一个向量,这个向量只有一个维度,也有两个元素,就这样了,你的向量现在是2乘 _,在第二个点什么都没有,因为向量没有定义。
你也可以从空间的Angular 来考虑,第一个数组在空间R^(2x2)中,第二个向量在空间R^(2)中,这意味着数组定义在一个与向量不同(且更大)的空间中。
这基本上就是说,你从数组中取出了一个切片,与MATLAB不同,numpy不像表示数组(二维或多维)那样表示向量(一维)。

相关问题