2015-08-27 40 views
2

我最近从Matlab/Octave切换到SciPy/NumPy,我喜欢它。但是我发现有时候我会因为细微的差异而感到困惑。在NumPy中,np.array([1,2,3,4,5])与np.array([[1],[2],[3],[4],[5]])不同吗?

在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” 中的相同NumPy的 “X”?我认为它不是。我可能会误解某些东西,但是有没有人可以在这个话题上给我启发?

谢谢!

+3

在MATLAB中的矩阵具有至少2个尺寸(年前它有完全相同2)。在numpy中,一个数组可以有任何数字 - 0,1,2等。另一个重要的区别 - MATLAB'pads'数组尺寸在最后,因此是'(5,1)'形状。 numpy在开始时添加它们 - 如果需要的话。 – hpaulj

+0

感谢您的评论!但我认为MATLAB在结尾“填充”数组维度并不是真的。正如你所提到的,在Matlab中,一个矩阵具有二维,并且一个向量被假定为一个特殊类型的维数为N×1或1×N的矩阵。所以一个行向量的大小变为[1,N ]。如果它是列向量,则大小变为[N,1]。 – chanwcom

+0

如果我要求“第10”维度,那么告诉我'1':'size(1:10,10)'没有问题。 – hpaulj

回答

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,)的阵列,它具有1个维。

相反,

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

是形状(5, 1)的阵列,并且有2种尺寸。 因此,xy是不一样的。在NumPy的行话


注意,“大小”或阵列是指值的数组中的编号:

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

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

NumPy的阵列可以"broadcast"它们的值要像阵列更高的维度。由于广播可以将新轴添加到阵列形状的左侧,形状(5,)的阵列可以广播以形成(1, 5)

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

如果用形状(5, 1)(即列矢量)的阵列添加形状(1, 5)(即行矢量)的阵列,所述广播规则产生形状(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]。 增加两个列向量产生另一列向量:

In [61]: x[:, np.newaxis].shape 
Out[61]: (5, 1) 

In [56]: x[:, np.newaxis] + y 
Out[56]: 
array([[ 2], 
     [ 4], 
     [ 6], 
     [ 8], 
     [10]]) 
相关问题