2015-08-04 2 views
2

Допустим, у меня есть Numpy массив со следующей формы:фильтр 2D-NumPy массив из массива значений

nonSortedNonFiltered=np.array([[9,8,5,4,6,7,1,2,3],[1,3,2,6,4,5,7,9,8]]) 

Я хочу:

- сортирует массив в соответствии с nonSortedNonFiltered [1 ] - Фильтр массива в соответствии с nonSortedNonFiltered [0] и массив значений

настоящее время я сортировки с:

sortedNonFiltered=nonSortedNonFiltered[:,nonSortedNonFiltered[1].argsort()] 

Что дает: np.array([[9 5 8 6 7 4 1 3 2],[1 2 3 4 5 6 7 8 9]])

Теперь я хочу, чтобы фильтровать sortedNonFiltered из массива значений, например:

sortedNonFiltered=np.array([[9 5 8 6 7 4 1 3 2],[1 2 3 4 5 6 7 8 9]]) 
listOfValues=np.array([8 6 5 2 1]) 
...Something here... 

> np.array([5 8 6 1 2],[2 3 4 7 9]) #What I want to get in the end 

Примечание: Каждое значение в колонке моего 2D массива является эксклюзивным.

ответ

2

Вы можете использовать np.in1d, чтобы получить булево маску и использовать его для фильтрации столбцов в массиве, что-то вроде этого -

output = sortedNonFiltered[:,np.in1d(sortedNonFiltered[0],listOfValues)] 

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

In [76]: nonSortedNonFiltered 
Out[76]: 
array([[9, 8, 5, 4, 6, 7, 1, 2, 3], 
     [1, 3, 2, 6, 4, 5, 7, 9, 8]]) 

In [77]: sortedNonFiltered 
Out[77]: 
array([[9, 5, 8, 6, 7, 4, 1, 3, 2], 
     [1, 2, 3, 4, 5, 6, 7, 8, 9]]) 
In [78]: listOfValues 
Out[78]: array([8, 6, 5, 2, 1]) 

In [79]: sortedNonFiltered[:,np.in1d(sortedNonFiltered[0],listOfValues)] 
Out[79]: 
array([[5, 8, 6, 1, 2], 
     [2, 3, 4, 7, 9]]) 
+1

ничего себе, что это прекрасно! Я выполнял цикл, но это было слишком медленно для моего огромного количества значений. Это лучше работает –

+0

@OdgyGsf Да, 'np.in1d' достаточно эффективен для решения таких случаев. – Divakar

Смежные вопросы