2016-12-08 2 views
2

Я хочу получить строки из массива numpy, которое имеет конкретное значение в одном столбце. Пример ниже показывает мой подход. Мне удалось получить строку, когда я дал определенное значение, но когда я дал несколько значений как ('4', '8'), я не получил ожидаемые строки.Выберите строки, в которых определенный столбец содержит значения из списка

import numpy as np 

arr = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]]) 
arr2 = arr[arr[:,3] == 4] 
arr3 = arr[arr[:,3] in ('4', '8')] 

обр является array([[ 1, 2, 3, 4],[ 5, 6, 7, 8], [ 9, 10, 11, 12]])

arr2 является array([[1, 2, 3, 4]])

arr3 является array([1, 2, 3, 4]).

Какую команду следует использовать для получения вывода array([[1, 2, 3, 4], [ 5, 6, 7, 8]])?

ответ

1

Используйте np.in1d создать маску любого вхождения элементов, которые мы ищем, а затем просто использовать boolean indexing выбрать допустимые строки выключения входного массива -

arr[np.in1d(arr[:,3], [4,8])] 

Пример запуск -

In [149]: arr 
Out[149]: 
array([[ 1, 2, 3, 4], 
     [ 5, 6, 7, 8], 
     [ 9, 10, 11, 12]]) 

In [150]: np.in1d(arr[:,3], [4,8]) # Mask of valid ones 
Out[150]: array([ True, True, False], dtype=bool) 

In [151]: arr[np.in1d(arr[:,3], [4,8])] # Select rows off arr 
Out[151]: 
array([[1, 2, 3, 4], 
     [5, 6, 7, 8]]) 
+0

большое спасибо :) Я принимаю этот ответ, как только он включен (~ 10 мин) –

0

Хотя нет причин отклоняться от numpy-обратного, я думал, что предоставил бы другой подход, используя понимание списка:

idxs = [True if any(value in (4, 8) for value in row) else False for row in arr] 

# convert it to a numpy array 
idxs = np.array(idxs) 

new_arr = arr[idxs] 

Смотреть результаты:

print(new_arr) 
[[1 2 3 4] 
[5 6 7 8]]