如何在numpy数组中索引轴?

gr8qqesn  于 2022-12-13  发布在  其他
关注(0)|答案(4)|浏览(129)

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

tzdcorbm

tzdcorbm1#

根据定义,维度的轴编号是该维度在数组shape中的索引,也是索引期间用来存取该维度的位置。
例如,如果二维数组a的形状为(5,6),则可以访问a[0,0]直到a[4,5]。因此,轴0是第一维(“行”),轴1是第二维(“列”)。在更高的维中,“行”和“列”不再有意义,请尝试根据所涉及的形状和索引来考虑轴。
例如,如果您执行.sum(axis=n),则维度n会折迭并删除,新矩阵中的每个值相等Map折迭值的总和。例如,如果b的形体为(5,6,7,8),而您执行c = b.sum(axis=2),则轴2(尺寸为7的维度),结果的形状为(5,6,8)。此外,c[x,y,z]等于所有元素b[x,y,:,z]的总和。

tzcvj98z

tzcvj98z2#

如果有人需要shape=(3,5)数组的以下直观描述:

gk7wooem

gk7wooem3#

您可以通过以下方式抓取轴:

>>> 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(4,2,3)形状中的第二维度编制索引。该层的每个数组中有2个元素:axis = 0,例如在数组中

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

y1aodyip

y1aodyip4#

通常,轴= 0表示第一维随第二维和第三维的每个值变化的所有像元,依此类推
例如,二维数组有两个Map的轴:第一个垂直向下跨行(轴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]]))

相关问题