2017-05-10 1 views
1

데이터 배열이 있으면 N 차원 색인 목록을 통해 데이터를 쿼리하는 방법이 있습니까?N 차원 색인 목록으로 numpy 배열 쿼리

예 :

import numpy as np 
data = np.array([[-14., 2., 19.], 
       [-13., 1., 20.], 
       [-15., 2., 18.], 
       [-13., 0., 19.], 
       [-15., 1., 19.], 
       [-14., 0., 19.], 
       [-14., 1., 20.]]) 


# Uniformly shaped array: works 
queries = np.array([[2, 4, 6, 0], [3, 6, 4, 5]]) 
print data[queries] 

# Properly returns 
#[[[-15. 2. 18.] 
# [-15. 1. 19.] 
# [-14. 1. 20.] 
# [-14. 2. 19.]] 
# 
# [[-13. 0. 19.] 
# [-14. 1. 20.] 
# [-15. 1. 19.] 
# [-14. 0. 19.]]] 


# N-dimentional array fails 
queries = np.array([[4, 6, 0], [3, 6, 4, 5]]) 
print data[queries] 

# IndexError: arrays used as indices must be of integer (or boolean) type # 
# 
# Desired result: 
#[[[-15. 1. 19.] 
# [-14. 1. 20.] 
# [-14. 2. 19.]] 
# 
# [[-13. 0. 19.] 
# [-14. 1. 20.] 
# [-15. 1. 19.] 
# [-14. 0. 19.]]] 

답변

1

길이가 다른쿼리의 두 가지 요소, 그래서 그들은 대신 NumPy와 배열의 목록으로 저장됩니다; 마찬가지로 결과도 내부적으로리스트로 저장 될 것이고 파이썬리스트에 대해 numpy 배열을 사용하는 이점은 없을 것이다. 아마 당신은 할 수있는 최선은 루프에 대한 법선입니다 :

[data[query].tolist() for query in queries] 

#[[[-15.0, 1.0, 19.0], 
# [-14.0, 1.0, 20.0], 
# [-14.0, 2.0, 19.0]], 
# 
# [[-13.0, 0.0, 19.0], 
# [-14.0, 1.0, 20.0], 
# [-15.0, 1.0, 19.0], 
# [-14.0, 0.0, 19.0]]] 

아니면 결과를 유지하기 위해 부분적으로 NumPy와 배열을 원하는 경우 :

[data[query] for query in queries] 

#[array([[-15., 1., 19.], 
#  [-14., 1., 20.], 
#  [-14., 2., 19.]]), array([[-13., 0., 19.], 
#  [-14., 1., 20.], 
#  [-15., 1., 19.], 
#  [-14., 0., 19.]])] 
+0

순회 배열 내 현재이었다 이상을 해결 방법이지만, np.array의 백그라운드에서 진행되는 작업에 대한 설명은 내가 혼란스러워했던 것입니다. 고맙습니다! – Fnord

+0

차가움. 다행 이구나! – Psidom

0

print [data[q] for q in queries]

관련 문제