一维数组形状 (长度,) vs. (长度,1) vs. (长度)
当我用 numpy.shape()
检查一个数组的形状时,有时候会得到 (length,1)
,有时候会得到 (length,)
。看起来这两者的区别是列向量和行向量……但似乎这并没有改变数组本身的内容【除了有些函数在我传入形状为 (length,1)
的数组时会抱怨】。
这两者之间有什么区别呢?
为什么形状不能直接是 (length)
呢?
4 个回答
在Python中,向量其实是一个二维数组。之所以说是二维,是因为它的行数是1(这叫行向量),或者列数是1(这叫列向量),这只是一个巧合。
相对而言,一维数组就不是向量(既不是行向量也不是列向量)。要理解这个,可以想象一个几何概念,叫做标量。标量只有一个属性,就是数字。而向量有两个属性,一个是数字,另一个是方向。幸运的是,在线性代数中,向量也有“方向”,不过只有两种可能的方向——要么是水平的,要么是垂直的(这和几何中的无限方向不同)。一维数组只有数字的意义——它并不表示这个数组指向哪个方向。这就是为什么我们需要二维数组来描述向量的原因。
这个(length,)数组是一个数组,里面的每个元素都是一个数字,并且这个数组有length个元素。而(length, 1)数组也是有length个元素的数组,但每个元素本身是一个只包含一个元素的数组。举个例子,下面的代码使用了length=3。
>>> import numpy as np
>>> a = np.array( [[1],[2],[3]] )
>>> a.shape
>>> (3, 1)
>>> b = np.array( [1,2,3] )
>>> b.shape
>>> (3,)
在Python中,(length,)
是一个元组,里面有一个元素。而(length)
只是把一个数字用括号括起来,并不算是元组。
在numpy
中,数组可以有任意数量的维度,比如0维、1维、2维等等。你问的是1维和2维对象之间的区别。(length,1)
是一个包含两个元素的元组,它表示一个二维数组的维度。
如果你习惯使用MATLAB,可能会对那里的数组感到困惑,因为在MATLAB中,所有数组都是二维或更高维的。
重点是,一个向量可以被看作是:
- 一个向量
- 一个只有一列的矩阵
- 一个三维数组,其中第二和第三个维度的长度都是一
- ...
你可以使用 [:, np.newaxis]
这个语法来增加维度,或者使用 np.squeeze
来去掉维度:
>>> xs = np.array([1, 2, 3, 4, 5])
>>> xs.shape
(5,)
>>> xs[:, np.newaxis].shape # a matrix with only one column
(5, 1)
>>> xs[np.newaxis, :].shape # a matrix with only one row
(1, 5)
>>> xs[:, np.newaxis, np.newaxis].shape # a 3 dimensional array
(5, 1, 1)
>>> np.squeeze(xs[:, np.newaxis, np.newaxis]).shape
(5,)