【问题标题】:In Python NumPy what is a dimension and axis?在 Python NumPy 中,维度和轴是什么?
【发布时间】:2013-10-23 18:29:09
【问题描述】:

我正在使用 Pythons NumPy 模块进行编码。如果 3D 空间中一个点的坐标被描述为[1, 2, 1],那不就是三个维度,三个轴,一个等级三吗?或者如果那是一维,那么它不应该是点(复数),而不是点吗?

这是文档:

在 Numpy 中,维度被称为轴。轴的数量是等级。 例如,3D 空间 [1, 2, 1] 中一个点的坐标是一个秩为 1 的数组,因为它有一个轴。该轴的长度为 3.

来源:http://wiki.scipy.org/Tentative_NumPy_Tutorial

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    在 numpy arrays 中,维度是指索引它所需的 axes 的数量,而不是任何几何空间的维度。例如,您可以使用 2D 数组来描述 3D 空间中点的位置:

    array([[0, 0, 0],
           [1, 2, 3],
           [2, 2, 2],
           [9, 9, 9]])
    

    具有shape(4, 3) 和维度2。但它可以描述 3D 空间,因为每行 (axis1) 的长度为 3,因此每行可以是点位置的 x、y 和 z 分量。 axis 0 的长度表示点数(这里为 4)。但是,这更多是对代码描述的数学的应用,而不是数组本身的属性。在数学中,向量的维度将是它的长度(例如,3d 向量的 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)
    

    【讨论】:

      【解决方案2】:

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

      【解决方案3】:

      它是排名第一的,因为您需要一个索引来索引它。该轴的长度为 3,因为索引索引它可以采用三个不同的值:v[i], i=0..2

      【讨论】:

        【解决方案4】:

        只需粘贴此answer 的部分答案:

        在 Numpy 中,dimensionaxis/axesshape 是相关且有时相似的概念:

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

        尺寸

        数学/物理学中,维度或维度被非正式地定义为指定空间内任何点所需的最小坐标数。但是在Numpy中,根据numpy doc,它和axis/axes是一样的:

        在 Numpy 中,维度被称为轴。轴数为rank。

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

        轴/轴

        nth 坐标在 Numpy 中索引 array。并且多维数组每个轴可以有一个索引。

        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
        

        【讨论】:

          【解决方案5】:

          您也可以在分组操作中使用axis参数,如果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])
          

          【讨论】:

            【解决方案6】:

            我是这样理解的。 点是一维对象。你只能定义它的位置。它没有维度。 线或面是二维对象。您可以分别通过其位置和长度或面积来定义它,例如矩形、正方形、圆形 体积是一个 3D 对象。您可以通过其位置、表面积/长度和体积来定义它,例如球体,立方体。

            由此,您将在 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 ]]。 对于一个表面,它只需要更多的点来描述它,但仍然是一个 2D 对象。例如,三角形需要 3 个点,而矩形/正方形需要 4 个。

            一个体积需要 4 个(四面体)或更多点来定义它,但仍保持点“嵌套”到第三维 (3D)。

            【讨论】:

              【解决方案7】:

              为了理解维度和轴,理解张量及其秩很重要。向量是秩为 1 的张量,矩阵是秩为 2 的张量,依此类推。 考虑以下几点:

              x = np.array([0,3,4,5,8])
              

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2022-12-25
                • 1970-01-01
                • 2015-08-04
                • 2017-09-02
                相关资源
                最近更新 更多