如何在numpy的数组中索引轴?

Alc*_*ott 63 python numpy

Numpy的教程中,轴可以用整数编制索引,就像0用于列,1用于行,但我不明白为什么它们以这种方式编入索引?在处理多维数组时,如何计算每个轴的索引?

nne*_*neo 108

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

例如,如果2D阵列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].

  • 非常感谢,@ nneonneo.最后,我明白了.现在我很好奇你的解释.我没有在官方[文档]中找到(https://docs.scipy.org/doc/numpy-dev/user/quickstart.html).你是从哪里学习这些的?如果它是你的创作,那么请告诉你是否有任何博客或者我可以在哪里了解更多. (2认同)
  • @PirateApp 正如我所说,将这些术语应用到 3D 数组有点困难。“深度”通道的位置取决于应用程序和约定 - 有时是 0,有时是 2,有时“深度”通道根本没有意义。 (2认同)

deb*_*e4u 23

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

Numpy数组轴0和1

  • 形状为 (3,5) (3认同)

Lyn*_*Lyn 10

你可以用这种方式掌握轴:

>>> 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)
Run Code Online (Sandbox Code Playgroud)

我创建了一个具有不同值的形状数组,(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]]
Run Code Online (Sandbox Code Playgroud)

axis = 1索引形状中的第二个维度(4,2,3).图层的每个数组中有2个元素:axis = 0,ec在数组中

 array[[1, 2, 3],
       [2, 2, 3]]
Run Code Online (Sandbox Code Playgroud)

.这两个要素是:

array[1, 2, 3]

array[2, 2, 3]
Run Code Online (Sandbox Code Playgroud)

第三个形状值意味着层的每个数组元素中有3个元素:axis = 2.ec有3个元素array[1, 2, 3].这是明确的.

而且,您可以从[]开头或结尾的数字中分辨出轴/尺寸.在这种情况下,数量是3( [[[),所以你可以选择axisaxis = 0,axis = 1axis = 2.


小智 5

通常,轴= 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]]))
Run Code Online (Sandbox Code Playgroud)