2015-06-28 4 views
3

Я хочу выбирать только строки, которые не имеют никакого элемента 0.Numpy выберите ненулевые строки

data = np.array([[1,2,3,4,5], 
       [6,7,0,9,10], 
       [11,12,13,14,15], 
       [16,17,18,19,0]]) 

Результат будет выглядеть так:

array([[1,2,3,4,5], 
     [11,12,13,14,15]]) 

ответ

8

Использование numpy.all:

>>> data[np.all(data, axis=1)] 
array([[ 1, 2, 3, 4, 5], 
     [11, 12, 13, 14, 15]]) 
2

Вы можете обнаружить все нули с data ==0, которая даст вам булево массив, а затем выполнить np.any вдоль каждой строки в теме. В качестве альтернативы вы можете обнаружить все не-нули с data!=0, а затем сделать np.all, чтобы получить строку строк строк без нуля.

Также можно использовать np.einsum, чтобы заменить np.any, что я лично считаю сумасшедшим, но в хорошем смысле, поскольку это дает нам заметное повышение производительности, как мы могли бы подтвердить позже в этом решении.

Таким образом, у вас будет три подхода, как указано ниже.

Подход № 1:

rows_without_zeros = data[~np.any(data==0, axis=1)] 

Подход № 2:

rows_without_zeros = data[np.all(data!=0, axis=1)] 

Подход № 3:

rows_without_zeros = data[~np.einsum('ij->i',data ==0)] 

время выполнения тестов -

В этом разделе раз три решения предложенный в является решением, а также включает тайминги для @Ashwini Chaudhary's approach, который также основан на np.all, но не использует маску или логический массив (по крайней мере, не во внешнем интерфейсе).

In [129]: data = np.random.randint(-10,10,(10000,10)) 

In [130]: %timeit data[np.all(data, axis=1)] 
1000 loops, best of 3: 1.09 ms per loop 

In [131]: %timeit data[np.all(data!=0, axis=1)] 
1000 loops, best of 3: 1.03 ms per loop 

In [132]: %timeit data[~np.any(data==0,1)] 
1000 loops, best of 3: 1 ms per loop 

In [133]: %timeit data[~np.einsum('ij->i',data ==0)] 
1000 loops, best of 3: 825 µs per loop 

Таким образом, кажется, что поставляет маски np.all или np.any дает немного (около 9%) прироста производительности по подходу, основанному без маски. С einsum вы смотрите на 20% улучшение по сравнению с np.any и np.all основано на подходах, что неплохо!

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