Python: 3차원 배열 이미지(numpy.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]]])
Reference
이 문제에 관하여(Python: 3차원 배열 이미지(numpy.array)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ken_yoshi/items/4cbe3abb7d46c5252fdd텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)