Python: 3차원 배열 이미지(numpy.array)

18529 단어 파이썬numpy
numpy의 3차원 배열을 머리로 이미지하는 것이 싫어서, axis=1은 어디를 가리키는 거야? 처럼 매번이므로 나름대로의 이해를 정리합니다. 이하, 「배열」은 np.array 를 가리킵니다.

계기



「기계 학습의 에센스」(저: 카토 공일)에서, 2차원 벡터를 7개 배열한 2차원 배열 X와 3개 배열한 2차원 배열 cluster_centers가 있을 때, 양자의 벡터간의 거리의 제곱 을 총당으로 구하는 계산을 이하와 같이 하고 있었습니다(제3판 pp.354-356으로부터 발췌).
>>> X = np.array([[1, 2],
                  [2, 3],
                  [3, 4],
                  [4, 5],
                  [5, 6],
                  [7, 9]])

>>> cluster_centers = np.array([[1, 1],
                                [2, 2],
                                [3, 3]])

>>> ((X[:, :, np.newaxis]
      - cluster_centers.T[np.newaxis, :, :])**2).sum(axis=1)
array([[  1,   1,   5],
       [  5,   1,   1],
       [ 13,   5,   1],
       [ 25,  13,   5],
       [ 41,  25,  13],
       [ 61,  41,  25],
       [100,  74,  52]])

너무 우아했고, 뭔가 뭔지 모르겠어요. 울다
np.newaxis란 무엇인가 라고 하는 곳으로부터 시작되어, X와 cluster_centers로 np.newaxis의 위치가 다르거나, 전치하거나 sum 하는 것으로 무엇이 무엇인가……(책에서는 보충 설명을 해 주고 있습니다만, 그래도 나에게는 장애물이 너무 높았다)
라는 이유로 이것을 제가 이해할 때까지의 길을 적어 둡니다. 길어졌기 때문에 전후반에 기사를 나눕니다. 본 기사에서는 배열의 이미지와 np.newaxis가 뭐라고 하는 곳까지. 후반은 여기 .

STEP 1. 배열의 기본 이미지



드디어.

1차원 배열


>>> x = np.array([1, 2, 3])

벡터입니다. 일단 표시 거리의 가로 벡터 $(1, 2, 3)$ 을 이미지합니다.
>>> y = np.array([1])

또, 요소가 하나만으로도 1차원 「배열」입니다. 요소가 늘어날 가능성이 있으므로, 옆에 쭉 늘어선 매스 눈에 하나만 숫자가 들어가 있는 이미지. $(1,\ldots)$ 같은.


2차원 배열


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

외형대로, 가로 벡터가 세로로 이어져 있는 이미지를 합니다. 행렬로는
A = \left(
    \begin{array}{ccc}
      1 & 2 & 3 \\
      4 & 5 & 6 \\
    \end{array}
  \right).
>>> B = np.array([[1, 2, 3]])
>>> C = np.array([[1],
                  [2],
                  [3]])

이것도 2차원 배열입니다. B는 세로로 이어져야 하는 가로 벡터가 하나밖에 없는 상태로, 가로로 늘어선 매스눈의 1열째에만 숫자가 들어가 있는 이미지. C는 요소가 하나만 있는 가로 벡터가 세로로 3개 늘어서 있다.

배열의 요소를 꺼내는 방법이나 axis의 이미지는 다음과 같은 느낌.
# インデックスは最初の数字に二次元目の軸(縦方向)を、2番目に横方向を指定する。
>>> A[1, 2]
6

# 数字のところをコロンにするとその軸全部とってくる。次元が一つ下がってベクトルになる。
>>> A[0, :]  
array([1, 2, 3])

# 縦の軸をとってきても1次元になる。
>>> A[:, 1]  
array([2, 5])

# 縦軸(二次元目)がaxis=0、横軸(一次元目)がaxis=1 (A.sumは軸ごとの合計)
>>> A.sum(axis=0)  
array([5, 7, 9])
>>> A.sum(1)  # "axis="は省略可
array([6, 15])



3차원 배열



3차원 배열은, 2차원의 매스눈이 깊이 방향으로 몇장이나 있는 느낌
>>> X = np.array([[[1,  2,  3],
                   [4,  5,  6]],

                  [[7,  8,  9],
                   [10, 11, 12]]])

>>> Y = np.array([[[1]]])

Y 같은 것도 3차원 배열. 깊이, 세로, 가로 방향으로 매스 눈은 준비되어 있지만, 하나 밖에 묻혀 있지 않은 상태.

위에서 2차원 배열로부터 1차원 배열을 꺼낼 수 있듯이, 콜론을 2개 사용하면 3차원 배열로부터 2차원 배열을 꺼낼 수 있다. 다만, 조금 이미지가 잡기 어렵다.
# 最初の数字が三次元目の軸(奥行き方向)、2番目が二次元目の軸(縦)、3番目が一次元目(横)
>>> X[0, 1, 2]
6

# 奥行き軸(axis=0)の0番目を取り出す
>>> X[0, :, :]
array([[1, 2, 3],
       [4, 5, 6]])

# 縦軸(axis=1)の1番目を取り出す
>>> X[:, 1, :]
array([[ 4,  5,  6],
       [10, 11, 12]])

# 横軸(axis=2)の2番目を取り出す
>>> X[:, :, 2]
array([[ 3,  6],
       [ 9, 12]])



STEP 2. 배열에 축을 추가하여 차원을 올립니다.



위에서 한 슬라이싱으로 배열을 꺼내는 조작과는 반대로, 배열에 새롭게 축을 추가해 차원을 올릴 수도 있습니다.

1차원에서 2차원으로


>>> x = np.array([1, 2, 3])

# 軸の追加にはnp.newaxisを使う。
# axis=0(縦の軸)を追加
>>> x[np.newaxis, :]
array([[1, 2, 3]])

# axis=1の追加。xの要素を縦(axis=0)に並べて、横軸(axis=1)を作る。
>>> x[:, np.newaxis]
array([[1],
       [2],
       [3]])

# np.newaxisはNoneで代用可
>>> x[None, :]
array([[1, 2, 3]])



2차원에서 3차원으로


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

# axis=0(奥行きの軸)を追加
>>> A[np.newaxis, :, :]
array([[[1, 2, 3],
        [4, 5, 6]]])

# axis=1(縦軸)を追加。xの要素を3次元格子の上の面に並べる。
>>> A[:, np.newaxis, :]
array([[[1, 2, 3]],

       [[4, 5, 6]]])

# axis=2(横軸)を追加。xの要素を3次元格子のサイドの面に並べる。
>>> A[:, :, np.newaxis]
array([[[1],
        [2],
        [3]],

       [[4],
        [5],
        [6]]])

좋은 웹페이지 즐겨찾기