2017-12-08 1 views
0

3D numpy 배열을위한 가장 효율적인 방법을 찾으려고합니다. 이는 테스트 용도로만 데이터의 하위 집합입니다.3d 어레이에서 효율적인 너비 슬라이싱

in_arr =np.array([[[0,1,2,5],[2,3,2,6],[0,1,3,2]],[[1,2,3,4],[3,1,0,5],[2,4,0,1]]]) 
indx =[[3,1,2],[2,0,1]] 

명시된대로 indx에서 값을 가져와야합니다. 예를 들어, indx [0] [0]은 3이므로 in_arr [0] [0]의 세 번째 요소 인이 경우 5를 찾고 있습니다.

다음과 같은 코드가 있습니다. 그게 필요하지만, 시간 복잡성은 n^2이며, 나는 그것에 대해 만족하지 못합니다.

list_in =[] 
for x in range(len(indx)): 
    arr2 = [] 
    for y in range(len(indx[x])): 
     arr2.append(in_arr[x][y][indx[x][y]]) 
     #print in_arr[x][y][indx[x][y]] 
    list_in.append(arr2) 
print list_in 

대용량 데이터 집합에 대해 동일한 작업을 수행하는 매우 빠르고 효율적인 방법을 찾고 있습니다.

+0

[인덱싱 문서] (https://docs.scipy.org/doc/numpy-1.13.0/reference/arrays.ar.indexing.html) 실제 답변을 원하시면 예제를 조금 개선하십시오. 예 : 작업에 대한 완전한 예상 출력을 추가하십시오. – sascha

답변

1

브로드 캐스트 된 인덱스 배열을 사용하면 효율적으로이 작업을 수행 할 수 있습니다. 예를 들어 :

i1 = np.arange(2)[:, np.newaxis] 
i2 = np.arange(3)[np.newaxis, :] 
i3 = np.array(indx) 
in_arr[i1, i2, i3] 
# array([[5, 3, 3], 
#  [3, 3, 4]]) 

무엇 NumPy와 여기 않습니다 효과적으로 세 개의 인덱스 배열의 항목과 일치하고, in_arr에서 관련 항목을 추출하는 것입니다 다음 [:, np.newaxis][np.newaxis, :] 용어에 대한 이유는이 세 개의 배열을 고쳐이다 numpy의 broadcasting 규칙을 통해 호환됩니다.

+0

네, 이걸보고 있었는데 지금 이해하고 있습니다. 도움을 주셔서 감사합니다. – Martin

관련 문제