在NumPy中,np.array([1,2,3,4,5])与np.array不同([[1],[2],[3],[4],[5]])?

时间:2015-08-27 18:06:35

标签: arrays matlab numpy

我最近从Matlab / Octave切换到了SciPy / NumPy,我喜欢它。但我发现有时我会因为细微的差异而感到困惑。

在Matlab中,当我们声明一个"行向量"大小为5,然后我们使用以下命令:

x = [1, 2, 3 ,4, 5]  % in matlab

可以使用" size"来检查此向量的大小。命令如下图所示:

size(x)

ans =

     1     5

我曾假设NumPy中的以下内容与上述内容相同。

 x = np.array([1, 2, 3, 4, 5])  # in NumPy

但尺寸有些奇怪。

>>> np.shape(x)
(5,)

尺寸不是(5, 1),而是(5, )。它究竟意味着什么?我不太确定为什么这个元组的第二个元素是空的。

我检查了以下内容返回(5,1)

y = np.array([[1], [2], [3], [4], [5]]) 
np.shape(y)
(5, 1)

然后,是" y"与" x"相同在NumPy?我认为不是。我可能会误解某些东西,但任何人都可以在这个主题上启发我吗?

谢谢!

1 个答案:

答案 0 :(得分:7)

NumPy数组的形状始终是元组。 (5)不是元组,因为Python将其评估为等于数字5.要获得元组,必须在5之后添加逗号,如(5,)中所示。 因此,(5,)是一个包含1个值的元组,数字为5和 (5, 1)是一个包含2个值的元组,数字为5和1。

元组中元素的数量等于数组的数量。在NumPy术语中,尺寸也称为"轴"。 所以

x = np.array([1, 2, 3, 4, 5]) 

是一个形状为(5,)的数组,它有一个维度。

相比之下,

y = np.array([[1], [2], [3], [4], [5]]) 

是一个形状(5, 1)的数组,有2个维度。 因此,xy不一样。

在NumPy术语中注意," size"或者数组是指数组中值的数量:

In [48]: x.size
Out[48]: 5

In [49]: y.size
Out[49]: 5

NumPy数组可以使"broadcast"的值像高维数组一样运行。由于广播可以将新轴添加到阵列形状的左侧,因此形状(5,)的阵列可以广播到(1, 5)形状。

因为对于二维数组,第一轴可以被认为对应于行而第二轴被认为是列,像x这样的一维数组可以表现得像1行,5列数组 - 即行向量。 y具有形状(5, 1),使其成为5行1列数组 - 即列向量。

如果添加形状(1, 5)(即行向量)的数组,其形状为(5, 1)(即列向量),则广播规则会生成一个形状为{{1}的数组}:

(5, 5)

如果您希望In [60]: x + y Out[60]: array([[ 2, 3, 4, 5, 6], [ 3, 4, 5, 6, 7], [ 4, 5, 6, 7, 8], [ 5, 6, 7, 8, 9], [ 6, 7, 8, 9, 10]]) 充当列向量,则需要在右侧添加新轴。广播从不这样做,所以你必须用x手动完成。 添加两个列向量会生成另一个列向量:

x[:, np.newaxis]