축은 numpy의 배열에서 어떻게 인덱싱됩니까?


81

에서 NumPy와의 튜토리얼 처럼 축, 정수로 색인 할 수있다 0, 열위한 1행이지만, 그들은 이런 식으로 색인을 왜 이해하지? 그리고 다차원 배열에 대처할 때 각 축의 인덱스를 어떻게 알 수 있습니까?


16
01을 참조하고 열을 참조해야합니다. 나는 당신이 예 .sum(axis=0)를 들어 행을 따라 어떤 합계 생각하고 있다고 생각 합니다 (열 합계 생성).
nneonneo 2013-06-13

@nneonneo, 네 그게 내 말입니다. 각 축의 인덱스를 어떻게 알 수 있습니까?
Alcott

답변:


142

정의에 따라 차원의 축 번호는 배열의 shape. 인덱싱 중에 해당 차원에 액세스하는 데 사용되는 위치이기도합니다.

예를 들어 2D 배열의 a모양이 (5,6)이면 a[0,0]최대 a[4,5]. 따라서 축 0은 첫 번째 차원 ( "행")이고 축 1은 두 번째 차원 ( "열")입니다. "행"과 "열"이 실제로 의미가없는 더 높은 차원에서는 관련된 모양과 인덱스 측면에서 축을 생각하십시오.

.sum(axis=n)예를 들어 를 수행하면 차원 n이 축소되고 삭제되며 새 행렬의 각 값은 해당 축소 된 값의 합계와 동일합니다. 예를 들어, bshape (5,6,7,8)가 있고 그렇게 c = b.sum(axis=2)하면 축 2 (크기가 7 인 차원)가 축소되고 결과는 shape가 (5,6,8)됩니다. 또한 c[x,y,z]모든 요소의 합과 같습니다 b[x,y,:,z].


그 배열 (5,6,8)의 경우 5는 행의 수입니까 아니면 6입니까? 어떻게 시각화합니까? 행 열 깊이? 또는 깊이 행 열?
PirateApp

1
@PirateApp에서 말했듯이 3D 배열에 이러한 용어를 적용하는 것은 약간 어렵습니다. "깊이"채널의 위치는 응용 프로그램 및 규칙에 따라 다릅니다. 때로는 0, 때로는 2, 때로는 "깊이"채널이 전혀 의미가없는 경우도 있습니다.
nneonneo


17

다음과 같이 축을 잡을 수 있습니다.

>>> 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 = 0shape의 첫 번째 차원을 색인화합니다 (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, ec

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

. 두 가지 요소는 다음과 같습니다.

array[1, 2, 3]

array[2, 2, 3]

세 번째 모양 값은 레이어의 각 배열 요소에 3 개의 요소가 있음을 의미합니다 : axis = 2. ec에는 3 개의 요소가 array[1, 2, 3]있습니다. 그것은 명백합니다.

또한 []시작 또는 끝 의 숫자에서 축 / 치수를 알 수 있습니다 . 이 경우 숫자는 3 ( [[[)이므로 , 및 axis에서 선택할 수 있습니다 .axis = 0axis = 1axis = 2


6

일반적으로 axis = 0은 2 차원 및 3 차원의 각 값에 따라 달라지는 첫 번째 차원이있는 모든 셀을 의미합니다.

예를 들어, 2 차원 배열에는 두 개의 해당 축이 있습니다. 첫 번째 축은 행을 가로 질러 수직으로 아래쪽으로 이동하고 (축 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]]))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.