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

18
当我使用numpy.shape()检查数组的形状时,有时会得到(length,1)(length,)两种不同的结果。看起来区别在于列向量和行向量…但好像这并不改变数组本身的任何内容[除了某些函数在传递形状为(length,1)的数组时会引发错误]。
这两者之间有什么区别?为什么形状不仅仅是(length)呢?
4个回答

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,)

它明确地是“列”,而不是行吗?(即,它可以被视为“只有一行的矩阵”吗?) - DilithiumMatrix
1
@zhermes xs[:, np.newaxis] 是一列矩阵,xs[np.newaxis, :] 是一行矩阵。 - behzad.nouri

6
在Python中,(length,)是一个包含一个元素的元组。而(length)只是一个围绕数字的括号。
numpy中,一个数组可以有任意数量的维度,0、1、2等。你正在询问1维和2维对象之间的区别。(length,1)是一个包含两个元素的元组,给出了2D数组的维度。
如果你习惯于使用MATLAB,你可能会因为在那里所有的数组都是2维或更大而感到困惑。

零维数组的例子是什么? - Sarang Manjrekar
2
np.array(1)。形状为(), ndim为0。 - hpaulj

2

(长度)数组是一个数组,其中每个元素都是一个数字,并且数组中有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,)

0

在Python中,向量实际上是一个二维数组。这只是一个巧合,行数为1(对于行向量),或列数为1(对于列向量)。

相比之下,一维数组不是向量(既不是行向量也不是列向量)。要理解这一点,请思考几何中的概念——标量。标量只有一个属性,即数字。相比之下,向量有两个属性,数字和方向。幸运的是,在线性代数中,向量也有“方向”,尽管只有两个可能的方向——水平或垂直(与几何中无限可能的方向不同)。一维数组只有数字意义——它不显示该数组指向哪个方向。这就是为什么我们需要二维数组来描述向量的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接