一维数组形状 (长度,) vs. (长度,1) vs. (长度)

18 投票
4 回答
20809 浏览
提问于 2025-04-18 00:29

当我用 numpy.shape() 检查一个数组的形状时,有时候会得到 (length,1),有时候会得到 (length,)。看起来这两者的区别是列向量和行向量……但似乎这并没有改变数组本身的内容【除了有些函数在我传入形状为 (length,1) 的数组时会抱怨】。

这两者之间有什么区别呢?
为什么形状不能直接是 (length) 呢?

4 个回答

0

在Python中,向量其实是一个二维数组。之所以说是二维,是因为它的行数是1(这叫行向量),或者列数是1(这叫列向量),这只是一个巧合。

相对而言,一维数组就不是向量(既不是行向量也不是列向量)。要理解这个,可以想象一个几何概念,叫做标量。标量只有一个属性,就是数字。而向量有两个属性,一个是数字,另一个是方向。幸运的是,在线性代数中,向量也有“方向”,不过只有两种可能的方向——要么是水平的,要么是垂直的(这和几何中的无限方向不同)。一维数组只有数字的意义——它并不表示这个数组指向哪个方向。这就是为什么我们需要二维数组来描述向量的原因。

2

这个(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,)
6

在Python中,(length,)是一个元组,里面有一个元素。而(length)只是把一个数字用括号括起来,并不算是元组。

numpy中,数组可以有任意数量的维度,比如0维、1维、2维等等。你问的是1维和2维对象之间的区别。(length,1)是一个包含两个元素的元组,它表示一个二维数组的维度。

如果你习惯使用MATLAB,可能会对那里的数组感到困惑,因为在MATLAB中,所有数组都是二维或更高维的。

11

重点是,一个向量可以被看作是:

  • 一个向量
  • 一个只有一列的矩阵
  • 一个三维数组,其中第二和第三个维度的长度都是一
  • ...

你可以使用 [:, 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,)

撰写回答