numpy의 기본이 아닌 기술
배열을 사용한 배열 인덱스
배열의 인덱스(a[i]에 있어서의 i의 부분)에는 스칼라치를 가지는 것이 일반적입니다만, 여기에 배열을 넣을 수도 있습니다.
import numpy as np
a = np.arange(12)**2
i = np.array([1, 1, 3, 8, 5])
a[i] #array([ 1, 1, 9, 64, 25], dtype=int32)
무슨 일이 일어나고 있는지, 그림처럼 보입니다.
배열 i의 요소가 인덱스가 되어 그것을 사용하여 a의 배열에서 추출해 오는 이미지일까요?
인덱스가 2차원 배열에도 적용될 수 있습니다. 이 경우 출력도 2차원이 됩니다.
j = np.array([[3, 6, 7], [5, 9, 7]])
a[j]
#array([[ 9, 36, 49],
# [25, 81, 49]], dtype=int32)
튜토리얼 쪽에서는 RGB를 응용예로서 내고 있습니다만, 기계 학습으로 사용되는 one-hot 표현시에도 사용할 수 있을 것 같네요.
one_hot = np.array([[0, 0, 0],
[1, 0, 0],
[0, 1, 0],
[0, 0, 1]])
number = np.array([[0, 1, 2, 0],
[0, 3, 2, 0]])
one_hot[number]
#array([[[0, 0, 0],
# [1, 0, 0],
# [0, 1, 0],
# [0, 0, 0]],
#
# [[0, 0, 0],
# [0, 0, 1],
# [0, 1, 0],
# [0, 0, 0]]])
덧붙여서 number[one_hot[number]]
라고 해도 원래대로 돌아가는 것은 아니기 때문에 주의.
또, 인덱스에는 복수의 배열을 지정할 수도 있습니다.
a = np.arange(12).reshape(3,4)
#array([[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [ 8, 9, 10, 11]])
i = np.array([[0, 1],
[1, 2]])
j = np.array([[2, 1],
[3, 3]])
a[i, j]
#array([[ 2, 5],
# [ 7, 11]])
이것 또 어떻게 처리하고 있는지 해석이 어려운 곳입니다만, 다음과 같이 되어 있습니다.
배열의 인덱스에는, 리스트를 지정할 수도 있습니다.
a = np.arange(3,8)
a
#array([3, 4, 5, 6, 7])
a[[1,3,4]] = 0
a
#array([3, 0, 5, 0, 0])
이 때도 목록의 각 요소가 a의 인덱스로 처리됩니다.
리스트를 사용해 단번에 할당(대입)할 수도 있습니다만, 리스트내에 같은 수치가 있는 경우, 할당은 반복되어 마지막의 값이 대입됩니다.
a = np.arange(3,8)
a
#array([3, 4, 5, 6, 7])
a[[1,1,4]] = [1,2,3]
a
#array([3, 2, 5, 6, 3])
부울 배열을 사용한 인덱싱
배열에 논리 연산자를 주면 부울 배열을 만들 수 있습니다.
부울 배열을 인덱스로 하는 것으로, False가 되는 요소를 제거한 1차원 배열을 출력합니다(배열의 형태에 주의).
a = np.arange(-3,9).reshape(3,4)
a
#array([[-3, -2, -1, 0],
# [ 1, 2, 3, 4],
# [ 5, 6, 7, 8]])
b = a > 0
b
#array([[False, False, False, False],
# [ True, True, True, True],
# [ True, True, True, True]])
a[b]
#array([1, 2, 3, 4, 5, 6, 7, 8])
부울 배열을 인덱스로 하는 배열에 할당하는 것으로, 조건에 맞는 요소에 한 번에 대입할 수가 있습니다.
a[a<0] = 0
a
#array([[0, 0, 0, 0],
# [1, 2, 3, 4],
# [5, 6, 7, 8]])
차원(축)과 같은 부울 배열을 사용하면 보다 복잡한 추출도 가능합니다.
a = np.arange(12).reshape(3,4)
b1 = np.array([False,True,True])
b2 = np.array([True,False,True,False])
a[b1,:] #a[b1]でも可
#array([[ 4, 5, 6, 7],
# [ 8, 9, 10, 11]])
a[:,b2] #a[b2]でも可
#array([[ 0, 2],
# [ 4, 6],
# [ 8, 10]])
a[b1,b2]
#array([ 4, 10])
그림으로 보면 이런 간지.
이것, 왜 a[b1,b2]가[[4,6],[8,10]]가 아니고[4,10]이지요. 문서에도 a weird thing to do(이상한 것)라고 쓰고 있으므로, 그렇게 기억할 수밖에 없는 것일까요.
요약
이상, 배열을 이용한 배열의 인덱스와, 부울 배열을 사용한 인덱싱에 대해 소개했습니다. 취급이 어려운 기술이지만, 잘 다루면 분명 도움이 될 것입니다.
서두에 링크를 붙인 튜토리얼에는, 그 밖에도 테크닉이 실려 있다(잘 이해할 수 없었기 때문에 할애) 때문에, 여유가 있는 사람은 꼭 읽어 봐 주세요.
Reference
이 문제에 관하여(numpy의 기본이 아닌 기술), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/VDiUZnM1hUIzKvb/items/da70fe43e0c3880762b6
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
import numpy as np
a = np.arange(12)**2
i = np.array([1, 1, 3, 8, 5])
a[i] #array([ 1, 1, 9, 64, 25], dtype=int32)
j = np.array([[3, 6, 7], [5, 9, 7]])
a[j]
#array([[ 9, 36, 49],
# [25, 81, 49]], dtype=int32)
one_hot = np.array([[0, 0, 0],
[1, 0, 0],
[0, 1, 0],
[0, 0, 1]])
number = np.array([[0, 1, 2, 0],
[0, 3, 2, 0]])
one_hot[number]
#array([[[0, 0, 0],
# [1, 0, 0],
# [0, 1, 0],
# [0, 0, 0]],
#
# [[0, 0, 0],
# [0, 0, 1],
# [0, 1, 0],
# [0, 0, 0]]])
a = np.arange(12).reshape(3,4)
#array([[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [ 8, 9, 10, 11]])
i = np.array([[0, 1],
[1, 2]])
j = np.array([[2, 1],
[3, 3]])
a[i, j]
#array([[ 2, 5],
# [ 7, 11]])
a = np.arange(3,8)
a
#array([3, 4, 5, 6, 7])
a[[1,3,4]] = 0
a
#array([3, 0, 5, 0, 0])
a = np.arange(3,8)
a
#array([3, 4, 5, 6, 7])
a[[1,1,4]] = [1,2,3]
a
#array([3, 2, 5, 6, 3])
배열에 논리 연산자를 주면 부울 배열을 만들 수 있습니다.
부울 배열을 인덱스로 하는 것으로, False가 되는 요소를 제거한 1차원 배열을 출력합니다(배열의 형태에 주의).
a = np.arange(-3,9).reshape(3,4)
a
#array([[-3, -2, -1, 0],
# [ 1, 2, 3, 4],
# [ 5, 6, 7, 8]])
b = a > 0
b
#array([[False, False, False, False],
# [ True, True, True, True],
# [ True, True, True, True]])
a[b]
#array([1, 2, 3, 4, 5, 6, 7, 8])
부울 배열을 인덱스로 하는 배열에 할당하는 것으로, 조건에 맞는 요소에 한 번에 대입할 수가 있습니다.
a[a<0] = 0
a
#array([[0, 0, 0, 0],
# [1, 2, 3, 4],
# [5, 6, 7, 8]])
차원(축)과 같은 부울 배열을 사용하면 보다 복잡한 추출도 가능합니다.
a = np.arange(12).reshape(3,4)
b1 = np.array([False,True,True])
b2 = np.array([True,False,True,False])
a[b1,:] #a[b1]でも可
#array([[ 4, 5, 6, 7],
# [ 8, 9, 10, 11]])
a[:,b2] #a[b2]でも可
#array([[ 0, 2],
# [ 4, 6],
# [ 8, 10]])
a[b1,b2]
#array([ 4, 10])
그림으로 보면 이런 간지.
이것, 왜 a[b1,b2]가[[4,6],[8,10]]가 아니고[4,10]이지요. 문서에도 a weird thing to do(이상한 것)라고 쓰고 있으므로, 그렇게 기억할 수밖에 없는 것일까요.
요약
이상, 배열을 이용한 배열의 인덱스와, 부울 배열을 사용한 인덱싱에 대해 소개했습니다. 취급이 어려운 기술이지만, 잘 다루면 분명 도움이 될 것입니다.
서두에 링크를 붙인 튜토리얼에는, 그 밖에도 테크닉이 실려 있다(잘 이해할 수 없었기 때문에 할애) 때문에, 여유가 있는 사람은 꼭 읽어 봐 주세요.
Reference
이 문제에 관하여(numpy의 기본이 아닌 기술), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/VDiUZnM1hUIzKvb/items/da70fe43e0c3880762b6
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(numpy의 기본이 아닌 기술), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/VDiUZnM1hUIzKvb/items/da70fe43e0c3880762b6텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)