2015-04-07 4 views
5

У меня есть двумерный массив Numpy под названием meta с 3-мя колоннами .. то, что я хочу сделать, это:Numpy: Фильтрация строк по нескольким условиям?

  1. проверить, если первые два столбца ZERO
  2. проверить, если третий столбец меньше, чем X
  3. Возврат только те строки, которые соответствуют условию

Я сделал это работает, но решение кажется очень надуманным:

meta[ np.logical_and(np.all(meta[:,0:2] == [0,0],axis=1) , meta[:,2] < 20) ] 

Не могли бы вы придумать более чистый способ? Казалось трудно иметь несколько условий сразу; (

благодаря


Sorry первый раз, когда я скопированный неправильное выражение ... исправленный

+1

, как он работает с '' ==? вам нужно 'numpy.logical_and' – Kasramvd

+1

, который не работает ... он не сработает, если оба случая будут ложными –

ответ

7

вы можете использовать несколько фильтров в срезе, то. как это:

x = np.arange(90.).reshape(30, 3) 
#set the first 10 rows of cols 1,2 to be zero 
x[0:10, 0:2] = 0.0 
x[(x[:,0] == 0.) & (x[:,1] == 0.) & (x[:,2] > 10)] 
#should give only a few rows 
array([[ 0., 0., 11.], 
     [ 0., 0., 14.], 
     [ 0., 0., 17.], 
     [ 0., 0., 20.], 
     [ 0., 0., 23.], 
     [ 0., 0., 26.], 
     [ 0., 0., 29.]]) 
2

Как об этом -

meta[meta[:,2]<X * np.all(meta[:,0:2]==0,1),:] 

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

In [89]: meta 
Out[89]: 
array([[ 1, 2, 3, 4], 
     [ 0, 0, 2, 0], 
     [ 9, 0, 11, 12]]) 

In [90]: X 
Out[90]: 4 

In [91]: meta[meta[:,2]<X * np.all(meta[:,0:2]==0,1),:] 
Out[91]: array([[0, 0, 2, 0]]) 
Смежные вопросы