2013-06-22 3 views
0

Я смотрю на этот вопрос: Efficient thresholding filter of an array with numpyКак создать массив булевых индексов для многомерного массива NumPy?

У меня аналогичная проблема, но с двухмерного массива, где несколько координат и значения сохраняются в строках массива NumPy. Как я могу сделать подобную фильтрацию, как в вопросе выше?

Мои данные выглядит следующим образом:

>>> A.shape 
(4269862, 5) 

>>> A[0] 
array([ 2.27011719e+02, 0.00000000e+00, 2.88134766e+02, 
     2.00000000e+00, 7.69880000e+04], dtype=float32) 

И эти значения соответствуют X, Y, Z и значению1 и значение2. Я хочу, чтобы эффективно получить, например. все строки с X в 300-400, Y в 200-250 и Z в 200-300.

ответ

2

Вы можете создать булево маску, которая будет истинным, когда все ваши условия:

idx = ((A[:, 0] > 300) & (A[:, 0] < 400) & 
     (A[:, 1] > 200) & (A[:, 1] < 250) & 
     (A[:, 2] > 200) & (A[:, 2] < 300)) 

print A[idx] 
# this should give your array rows where idx is True 

Вы можете проверить это:

A = np.random.uniform(150, 500, (200, 5)).astype('i') 
idx = ((A[:, 0] > 300) & (A[:, 0] < 400) & 
     (A[:, 1] > 200) & (A[:, 1] < 250) & 
     (A[:, 2] > 200) & (A[:, 2] < 300)) 
print A[idx] 
#[[339 292 231 211 474] 
# [371 252 310 281 256] 
# [337 263 471 159 397] 
# [361 299 383 250 206] 
# [360 278 328 194 453] 
# [360 258 205 245 427] 
# [339 286 331 175 418]] 
+0

Спасибо, A [:, 0] было то, что я не мог понять. – Harriv