배열로부터 특정 원소의 값을 읽는 루틴을 쓰고 싶다. 요소 선택은 배열로 지정되며 각 행에는 요소 하나에 대한 인덱스가 포함됩니다. 루틴은 임의의 수의 축이있는 배열에 대해 작동해야합니다.임의의 축 번호를 가진 배열로부터 주어진 인덱스를 가진 원소를 읽는다.
아래의 해결책을 생각해 낼 수는 있지만 고급 색인 생성을 막기 위해 필요하지만 터플 (또는 목록)에 대한 변환이 불필요하다고 느끼기 때문에 나는 그것을 좋아하지 않습니다. 이것을하기에 더 이상 절망적 인 방법이 있습니까?
import numpy as np
def get_elements(aa, inds):
myinds = tuple(inds.transpose())
return aa[myinds]
AA = np.arange(6)
AA.shape = (3, 2)
inds = np.array([[ 0, 0 ], [ 2, 1 ]])
data2 = get_elements(AA, inds) # contains [ AA[0,0], A[2,1] ]
BB = np.arange(12)
BB.shape = (2, 3, 2)
inds = np.array([[ 0, 0, 0], [ 1, 2, 1 ]])
data3 = get_elements(BB, inds) # contains [ BB[0,0,0], BB[1,2,1] ]
가치가있는 경우 튜플 변환은 실제로 여기에서는 비효율적이지 않습니다. 'inds' 뷰의 튜플을 생성하므로 복사본이 없습니다 (동일한 메모리를 참조하는 새로운 파이썬 객체). 이것을하기위한 또 다른 방법이 있습니다 만, (예를 들어'b.take (np.ravel_multi_index (inds.T, b.shape))'와 같이'np.take'와'np.ravel_multi_index'를 결합하는 것이 훨씬 더 반복적입니다. –
많은 numpy 함수는 인덱스 또는 축 번호를 가져 와서 터플 인덱스를 생성합니다. – hpaulj
OK, 고맙습니다. 실제로 ravel_multi_index() 함수는 내가 생각하지 않은 옵션이 될 것입니다. –