2014-09-19 2 views
2

배열로부터 특정 원소의 값을 읽는 루틴을 쓰고 싶다. 요소 선택은 배열로 지정되며 각 행에는 요소 하나에 대한 인덱스가 포함됩니다. 루틴은 임의의 수의 축이있는 배열에 대해 작동해야합니다.임의의 축 번호를 가진 배열로부터 주어진 인덱스를 가진 원소를 읽는다.

아래의 해결책을 생각해 낼 수는 있지만 고급 색인 생성을 막기 위해 필요하지만 터플 (또는 목록)에 대한 변환이 불필요하다고 느끼기 때문에 나는 그것을 좋아하지 않습니다. 이것을하기에 더 이상 절망적 인 방법이 있습니까?

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] ] 
+2

가치가있는 경우 튜플 변환은 실제로 여기에서는 비효율적이지 않습니다. 'inds' 뷰의 튜플을 생성하므로 복사본이 없습니다 (동일한 메모리를 참조하는 새로운 파이썬 객체). 이것을하기위한 또 다른 방법이 있습니다 만, (예를 들어'b.take (np.ravel_multi_index (inds.T, b.shape))'와 같이'np.take'와'np.ravel_multi_index'를 결합하는 것이 훨씬 더 반복적입니다. –

+0

많은 numpy 함수는 인덱스 또는 축 번호를 가져 와서 터플 인덱스를 생성합니다. – hpaulj

+0

OK, 고맙습니다. 실제로 ravel_multi_index() 함수는 내가 생각하지 않은 옵션이 될 것입니다. –

답변

1

귀하의 tuple(ind.T) 같은 요소에 대한 np.where 같은 일을 생성합니다.

In [117]: AA=np.arange(6).reshape(3,2) 
In [118]: ind=np.array([[0,0],[2,1]]) 
In [119]: tuple(ind.T) 
Out[119]: (array([0, 2]), array([0, 1])) 
In [120]: AA[tuple(ind.T)] 
Out[120]: array([0, 5]) 

이 두 값의 인덱스 찾아 where 사용 : where의 문서에서

In [121]: np.where((AA==0) + (AA==5)) 
Out[121]: (array([0, 2]), array([0, 1])) 

을 그리고 복사의 [0,5] 값을 찾는 또 다른 방법 :

In [125]: np.in1d(AA.ravel(), [0,5]).reshape(AA.shape) 
Out[125]: 
array([[ True, False], 
     [False, False], 
     [False, True]], dtype=bool) 
In [126]: np.where(np.in1d(AA.ravel(), [0,5]).reshape(AA.shape)) 
Out[126]: (array([0, 2]), array([0, 1])) 

을 그래서 당신을 tuple 코드가 완벽하게 numpy 코드입니다.

numpy 인덱싱 문서에서 : 파이썬 의 X

주 [(EXP1는 EXP2는 ... EXPN는)] × [EXP1, EXP2, ... EXPN] 동등하다; 후자는 전자의 정당한 설탕이다.

+0

+1 문법 설탕 부분이 NumPy 배열로 멋진 색인 생성에 유효하다는 +1 만 ... –

관련 문제