我最近从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?我认为不是。我可能会误解某些东西,但任何人都可以在这个主题上启发我吗?
谢谢!
答案 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个维度。
因此,x
和y
不一样。
在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]