【问题标题】:how is axis indexed in numpy's array?numpy数组中的轴索引如何?
【发布时间】:2013-06-09 09:05:31
【问题描述】:

Numpy's tutorial 开始,轴可以用整数索引,比如0 用于列,1 用于行,但我不明白为什么它们以这种方式索引?以及在处理多维数组时如何计算每个轴的索引?

【问题讨论】:

  • 0 应该引用行,1 应该引用列。我怀疑你正在考虑例如.sum(axis=0) 沿行求和(产生列总数)。
  • @nneonneo,是的,这就是我的意思,那么我怎么知道每个轴的索引?

标签: python numpy


【解决方案1】:

根据定义,维度的轴号是该维度在数组shape 中的索引。它也是索引期间用于访问该维度的位置。

例如,如果二维数组 a 的形状为 (5,6),那么您可以访问 a[0,0]a[4,5]。因此,轴 0 是第一个维度(“行”),轴 1 是第二个维度(“列”)。在更高维度中,“行”和“列”不再有意义,请尝试根据所涉及的形状和索引来考虑轴。

例如,如果您执行.sum(axis=n),则维度n 将被折叠并删除,新矩阵中的每个值都等于相应折叠值的总和。例如,如果b 的形状为(5,6,7,8),而您执行c = b.sum(axis=2),则轴2(尺寸为7 的维度)被折叠,结果为形状(5,6,8)。此外,c[x,y,z] 等于所有元素的总和 b[x,y,:,z]

【讨论】:

  • 对于该数组 (5,6,8) 是 5 行数还是 6?你如何形象化它?行列深度?还是深度行列?
  • @PirateApp 正如我所说,将这些术语应用于 3D 数组有点困难。 “深度”通道的位置取决于应用程序和约定 - 有时是 0,有时是 2,有时拥有“深度”通道根本没有意义。
【解决方案2】:

如果有人需要shape=(3,5) 数组的视觉描述:

【讨论】:

【解决方案3】:

你可以这样抓轴:

>>> a = np.array([[[1,2,3],[2,2,3]],[[2,4,5],[1,3,6]],[[1,2,4],[2,3,4]],[[1,2,4],[1,2,6]]])
array([[[1, 2, 3],
    [2, 2, 3]],

   [[2, 4, 5],
    [1, 3, 6]],

   [[1, 2, 4],
    [2, 3, 4]],

   [[1, 2, 4],
    [1, 2, 6]]])
>>> a.shape
(4,2,3)

我创建了一个具有不同值的形状数组(4,2,3),以便您可以清楚地分辨结构。不同的轴意味着不同的“层”。

axis = 0 索引形状(4,2,3) 的第一个维度。它指的是第一个[] 中的数组。里面有4个元素,所以它的形状是4:

  array[[1, 2, 3],
        [2, 2, 3]],

  array[[2, 4, 5],
        [1, 3, 6]],

  array[[1, 2, 4],
        [2, 3, 4]],

  array[[1, 2, 4],
        [1, 2, 6]]

axis = 1 索引 shape(4,2,3) 中的第二个维度。该层的每个数组中有 2 个元素:axis = 0,e.c.在

的数组中
 array[[1, 2, 3],
       [2, 2, 3]]

。 这两个元素是:

array[1, 2, 3]

array[2, 2, 3]

第三个形状值表示层的每个数组元素中有3个元素:axis = 2。 e.c. array[1, 2, 3] 中有 3 个元素。这是明确的。

此外,您可以从开头或结尾的[] 的数量来判断轴/尺寸。在本例中,编号为 3([[[),因此您可以从axis = 0axis = 1axis = 2 中选择axis

【讨论】:

    【解决方案4】:

    通常,axis = 0,表示所有单元格的第一维随着第二维和第三维的每个值而变化,依此类推

    例如,二维数组有两个对应的轴:第一个垂直向下穿过行(轴 0),第二个垂直向下穿过列(轴 1)

    对于 3D,它变得复杂,所以,使用多个 for 循环

    >>> x = np.array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8]],
       [[ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17]],
       [[18, 19, 20],
        [21, 22, 23],
        [24, 25, 26]]])
    
    >>> x.shape #(3, 3, 3)
    
    #axis = 0 
    >>> for j in range(0, x.shape[1]):
          for k in range(0, x.shape[2]):
            print( "element = ", (j,k), " ", [ x[i,j,k] for i in range(0, x.shape[0]) ])
    ...
    element =  (0, 0)   [0, 9, 18]             #sum is 27
    element =  (0, 1)   [1, 10, 19]            #sum is 30
    element =  (0, 2)   [2, 11, 20]
    element =  (1, 0)   [3, 12, 21]
    element =  (1, 1)   [4, 13, 22]
    element =  (1, 2)   [5, 14, 23]
    element =  (2, 0)   [6, 15, 24]
    element =  (2, 1)   [7, 16, 25]
    element =  (2, 2)   [8, 17, 26]
    
    >>> x.sum(axis=0)            
    array([[27, 30, 33],
           [36, 39, 42],
           [45, 48, 51]])
    
    #axis = 1    
    for i in range(0, x.shape[0]):
        for k in range(0, x.shape[2]):
            print( "element = ", (i,k), " ", [ x[i,j,k] for j in range(0, x.shape[1]) ])
    
    element =  (0, 0)   [0, 3, 6]      #sum is 9 
    element =  (0, 1)   [1, 4, 7]
    element =  (0, 2)   [2, 5, 8]
    element =  (1, 0)   [9, 12, 15]
    element =  (1, 1)   [10, 13, 16]
    element =  (1, 2)   [11, 14, 17]
    element =  (2, 0)   [18, 21, 24]
    element =  (2, 1)   [19, 22, 25]
    element =  (2, 2)   [20, 23, 26]
    
    # for sum, axis is the first keyword, so we may omit it,
    
    >>> x.sum(0), x.sum(1), x.sum(2)
    (array([[27, 30, 33],
            [36, 39, 42],
            [45, 48, 51]]),
     array([[ 9, 12, 15],
            [36, 39, 42],
            [63, 66, 69]]),
     array([[ 3, 12, 21],
            [30, 39, 48],
            [57, 66, 75]]))
    

    【讨论】:

      猜你喜欢
      • 2021-07-20
      • 1970-01-01
      • 2021-12-17
      • 2015-11-12
      • 2019-11-18
      • 1970-01-01
      • 2012-01-29
      • 2011-07-25
      相关资源
      最近更新 更多