2014-09-15 4 views
0

numpy에는 많은 인덱싱 기능이 있지만 여전히 필요한 기능을 수행 할 수 없습니다.다차원 인덱싱 및 매핑

첫째, 두 개의 일차원 배열 동일한 형상의 A, I가 있다고 가정 I 요소에 인덱스 될 수있는 1 차원 배열 B 및 세 인수 함수 f. 그렇다면 starmap(f, zip(A, I, B[I])) (numpy이 아닌 순수 파이썬의 starmapzip과 같은) 결과를 얻을 수 있습니다. 지금까지 그렇게 좋은 ...

실제로 모든 배열은 두 개의 -dimensional이고 위와 같은 함수를 각 행에 적용하는 것과 같은 2 차원 결과를 얻고 싶습니다. 배열의 - 이것은 내가 지금 루프에서 무엇을하는지입니다.

그냥 루핑하는 것보다 더 좋은 방법이 있습니까?

UPD : 예를 들어

, 한 차원 배열과 :

A = np.random.randint(0, 10, size=(3,)) 
B = np.random.randint(0, 10, size=(5,)) 
I = np.random.randint(0, 5, size=(3,)) 

def f(a, i, b): 
    return (a, i, b) 

print A, I, B 
print list(starmap(f, zip(A, I, B[I]))) 

그리고 두 가지 차원에 대한 :

A = np.random.randint(0, 10, size=(2, 3)) 
B = np.random.randint(0, 10, size=(2, 5)) 
I = np.random.randint(0, 5, size=(2, 3)) 

def f(a, i, b): 
    return (a, i, b) 

print A 
print I 
print B 
print [list(starmap(f, zip(A_row, I_row, B_row[I_row]))) 
     for A_row, I_row, B_row in zip(A, I, B)] 
+0

wrt. "주먹이 있다고 가정하십시오 ..."왜 우리에게 코드를 알려주지 않으시겠습니까? 보여라, 말하지 마라. – Veedrac

+0

'f'는 무엇을합니까? – Jaime

+0

@Jaime :'f'는 변경할 수없는 라이브러리의 순수한 파이썬 함수입니다. – aplavin

답변

0

그냥 정상적인 기능이라면, 당신의 오버 헤드가 주로 함수 오버 헤드가 될 것입니다. hstack 또는 그 외의 것으로 zip을 할 수 있지만 속도면에서 도움이되지는 않습니다. 그냥 그 일의 깔끔한 방법을 찾고 있다면

,

x_indexes, _ = numpy.ogrid[:len(I), :0] 
numpy.vectorize(f)(A, I, B[x_indexes, I]) 

는 일반적으로 더 높은 수준보기 당신이 훨씬 더 빨리 될 것입니다 전체를, 벡터화 할 수보십시오. 이것이 천천히 끝나면 명심할 가치가 있습니다.

+0

실제로, 나는이 경우 많은 속도에 대해 걱정하지 않는다. 결과는 사용자에게 인쇄 될 것이므로 큰 것이 아니어야한다. 그러나이 게시물에서 제안한 것처럼 더 좋은 방법은 여러 가지 의미로 코드를 더 잘 만들 수 있습니다. 그리고, 그런데, 당신의 코드는 어떤 경우든지, 단일 또는 2 차원이 아니어도 작동하지 않습니다. – aplavin

+0

이제 작동 할 것입니다. 불행히도 그것은 꽤 덜 예쁘다. – Veedrac

+0

이 버전은 2 차원의 경우 예외를 발생시키지 않지만 출력은 필요한 것과 다릅니다 (요소 배열이 아닌 전체 배열에서'f'를 실행합니다). 문제의 코드와 비교하십시오. – aplavin