cha*_*com 2 arrays matlab numpy
我最近从Matlab/Octave切换到SciPy/NumPy,我喜欢它.但我发现有时候由于微妙的差异我会感到困惑.
在Matlab中,当我们声明一个大小为5的"行向量"时,我们使用以下命令:
x = [1, 2, 3 ,4, 5] % in matlab
Run Code Online (Sandbox Code Playgroud)
可以使用" size"命令检查此向量的大小,如下所示:
size(x)
ans =
1 5
Run Code Online (Sandbox Code Playgroud)
我曾假设NumPy中的以下内容与上面的内容完全相同.
x = np.array([1, 2, 3, 4, 5]) # in NumPy
Run Code Online (Sandbox Code Playgroud)
但是尺寸有些奇怪.
>>> np.shape(x)
(5,)
Run Code Online (Sandbox Code Playgroud)
尺寸不是(5, 1),但确实如此(5, ).它究竟意味着什么?我不太清楚为什么这个元组的第二个元素是空的.
我检查了以下返回(5,1)
y = np.array([[1], [2], [3], [4], [5]])
np.shape(y)
(5, 1)
Run Code Online (Sandbox Code Playgroud)
然后,"y"和NumPy中的"x"相同吗?我认为不是.我可能会误解某些东西,但任何人都可以启发我这个话题吗?
谢谢!
NumPy数组的形状总是一个元组. (5)不是元组,因为Python评估它等于数字5.要获得元组,必须在5之后添加逗号,如(5,).因此,(5,)是一个包含1个值的元组,数字5
(5, 1)是一个包含2个值的元组,数字5和1.
元组中元素的数量等于数组的数量.在NumPy术语中,尺寸也称为"轴".所以
x = np.array([1, 2, 3, 4, 5])
Run Code Online (Sandbox Code Playgroud)
是一个形状的数组(5,),它有一个维度.
相反,
y = np.array([[1], [2], [3], [4], [5]])
Run Code Online (Sandbox Code Playgroud)
是一个形状的数组,(5, 1)有2个维度.因此,x并且y不一样.
请注意,在NumPy术语中,"size"或数组是指数组中值的数量:
In [48]: x.size
Out[48]: 5
In [49]: y.size
Out[49]: 5
Run Code Online (Sandbox Code Playgroud)
NumPy数组可以"广播"它们的值,就像更高维度的数组一样.由于广播可以在阵列形状的左侧添加新轴,因此(5,)可以广播形状阵列(1, 5).
因为对于二维阵列,第一轴可以被认为对应于行而第二轴对应于列,一维数组x可以表现得像1行,5列阵列 - 即行向量.
y具有(5, 1)使其成为5行1列阵列的形状- 即列向量.
如果添加具有形状数组(1, 5)(即列向量)的形状数组(5, 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]])
Run Code Online (Sandbox Code Playgroud)
如果要x像列向量一样操作,则需要在右侧添加新轴.广播从不这样做,所以你必须手动完成x[:, np.newaxis].添加两个列向量会生成另一个列向量:
In [61]: x[:, np.newaxis].shape
Out[61]: (5, 1)
In [56]: x[:, np.newaxis] + y
Out[56]:
array([[ 2],
[ 4],
[ 6],
[ 8],
[10]])
Run Code Online (Sandbox Code Playgroud)