在Python的NumPy中,维度和轴是什么?

90
我正在使用Python的NumPy模块编码。如果一个三维空间点的坐标描述为[1, 2, 1],那不是三个维度、三个轴和秩为三吗?或者如果这是一个维度,那么应该是多个点(复数形式),而不是一个点(单数形式)吧?
以下是文档内容:
在Numpy中,维度被称为轴。轴的数量被称为秩。例如,一个三维空间点的坐标[1,2,1]是一个秩为1的数组,因为它只有一个轴。该轴的长度为3。
来源:链接
7个回答

106
在NumPy的array中,“维度(dimensionality)”指的是索引它所需的轴数(axes)数量,而不是任何几何空间的维度。例如,您可以使用2D数组描述3D空间中点的位置:
array([[0, 0, 0],
       [1, 2, 3],
       [2, 2, 2],
       [9, 9, 9]])

该数组的 shape(4, 3),维度为 2。但它可以描述三维空间,因为每一行(axis 1)的长度为三,所以每一行都可以是一个点位置的 x、y 和 z 分量。轴 0 的长度表示点的数量(这里是 4)。然而,这更多地是应用于代码所描述的数学,而不是数组本身的属性。在数学中,向量的维数将是其长度(例如,三维向量的 x、y 和 z 分量),但在 numpy 中,任何“向量”实际上只被认为是一个长度可变的 1d 数组。该数组不关心被描述空间的维度(如果有的话)。

您可以通过以下方式尝试并查看数组的维数和形状:

In [262]: a = np.arange(9)

In [263]: a
Out[263]: array([0, 1, 2, 3, 4, 5, 6, 7, 8])

In [264]: a.ndim    # number of dimensions
Out[264]: 1

In [265]: a.shape
Out[265]: (9,)

In [266]: b = np.array([[0,0,0],[1,2,3],[2,2,2],[9,9,9]])

In [267]: b
Out[267]: 
array([[0, 0, 0],
       [1, 2, 3],
       [2, 2, 2],
       [9, 9, 9]])

In [268]: b.ndim
Out[268]: 2

In [269]: b.shape
Out[269]: (4, 3)

数组可以有多个维度,但在两到三个以上的维度时很难进行可视化:

In [276]: c = np.random.rand(2,2,3,4)

In [277]: c
Out[277]: 
array([[[[ 0.33018579,  0.98074944,  0.25744133,  0.62154557],
         [ 0.70959511,  0.01784769,  0.01955593,  0.30062579],
         [ 0.83634557,  0.94636324,  0.88823617,  0.8997527 ]],

        [[ 0.4020885 ,  0.94229555,  0.309992  ,  0.7237458 ],
         [ 0.45036185,  0.51943908,  0.23432001,  0.05226692],
         [ 0.03170345,  0.91317231,  0.11720796,  0.31895275]]],


       [[[ 0.47801989,  0.02922993,  0.12118226,  0.94488471],
         [ 0.65439109,  0.77199972,  0.67024853,  0.27761443],
         [ 0.31602327,  0.42678546,  0.98878701,  0.46164756]],

        [[ 0.31585844,  0.80167337,  0.17401188,  0.61161196],
         [ 0.74908902,  0.45300247,  0.68023488,  0.79672751],
         [ 0.23597218,  0.78416727,  0.56036792,  0.55973686]]]])

In [278]: c.ndim
Out[278]: 4

In [279]: c.shape
Out[279]: (2, 2, 3, 4)

71

如果有人需要这个可视化描述:

numpy axis 0 and axis 1


2
https://dev59.com/4WEh5IYBdhLWcg3wrVDW - Debashis Sahoo

10

仅复制来自此答案的一部分:

在Numpy中,dimension(维度)axis/axes(轴)shape(形状)是相关且有时类似的概念:

In [1]: import numpy as np

In [2]: a = np.array([[1,2],[3,4]])

维度

在数学/物理学中,“维度”或“维数”通常被定义为指定空间内任何点所需的最小坐标数。然而,在NumPy中,根据NumPy文档,它与轴/轴相同:

在 NumPy 中,维度称为轴。轴的数量称为秩。

In [3]: a.ndim  # num of dimensions/axes, *Mathematics definition of dimension*
Out[3]: 2

轴/坐标轴

在Numpy中用于索引数组的第n个坐标,而多维数组可以在每个轴上拥有一个索引。

In [4]: a[1,0]  # to index `a`, we specific 1 at the first axis and 0 at the second axis.
Out[4]: 3  # which results in 3 (locate at the row 1 and column 0, 0-based index)

形状

描述每个可用轴线上有多少数据。

In [5]: a.shape
Out[5]: (2, 2)  # both the first and second axis have 2 (columns/rows/pages/blocks/...) data

9

这是一级张量,因为您需要一个索引来对其进行索引。这个轴的长度为3,因为索引可以取三个不同的值:v[i], i=0..2


5

您还可以在分组操作中使用参数,如果axis=0,则Numpy对每列的元素执行操作,如果axis=1,则对行执行操作。

test = np.arange(0,9).reshape(3,3)

Out[3]: 
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

test.sum(axis=0)
Out[5]: array([ 9, 12, 15])

test.sum(axis=1)
Out[6]: array([ 3, 12, 21])

4
这是我的理解。点是一维对象,只能定义其位置,没有维度。线或面是二维对象,可以通过其位置和长度或面积来定义,例如矩形、正方形、圆形。体积是三维对象,可以通过其位置、表面积/长度和体积来定义,例如球体、立方体。
因此,在NumPy中,无论使用多少数学轴,都可以通过单个轴(维度)定义一个点。对于x和y轴,点的定义为[2,4],对于x、y和z轴,点的定义为[2,4,6]。这两个都是点,因此是一维的。
要定义一条线,则需要两个点。这将需要将点“嵌套”到第二维(2D)中。因此,可以仅使用x和y定义线为[[2,4],[6,9]],也可以使用x、y和z定义线为[[2,4,6],[6,9,12]]。对于一个面,它将需要更多的点来描述,但仍然是一个二维对象。例如,三角形需要3个点,而矩形/正方形需要4个点。
要定义一个体积,将需要4个(四面体)或更多点来定义它,但仍然保持点的“嵌套”到第三维(3D)。

1
为了理解维度和轴,重要的是要了解张量及其秩。向量是一个秩为1的张量,矩阵是一个秩为2的张量,以此类推。 考虑以下内容:
x = np.array([0,3,4,5,8])

现在x是一个向量,因此是一个秩为1的张量。但是这个向量本身是5维的。在numpy中,秩=维数=轴。这与维度的传统定义略有偏差,对于上面显示的向量,其维度为5。因此最好坚持使用秩或轴,并按传统意义使用维度。

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