Вы можете обнаружить все нули с 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
основано на подходах, что неплохо!