удаление строк в массиве numpy

У меня есть массив, который может выглядеть так:

ANOVAInputMatrixValuesArray = [[ 0.96488889, 0.73641667, 0.67521429, 0.592875, 0.53172222], [ 0.78008333, 0.5938125, 0.481, 0.39883333, 0.]] 

Обратите внимание, что одна из строк имеет нулевое значение в конце. Я хочу удалить любую строку, содержащую нуль, сохраняя при этом любую строку, содержащую ненулевые значения во всех ячейках.

Но массив будет иметь разные количества строк при каждом заполнении, а нули будут располагаться в разных строках каждый раз.

Я получаю число ненулевых элементов в каждой строке со следующей строкой кода:

 NumNonzeroElementsInRows = (ANOVAInputMatrixValuesArray != 0).sum(1) 

Для массива, приведенного выше, NumNonzeroElementsInRows содержит: [5 4]

Пять указывают, что все возможные значения в строке 0 отличны от нуля, а четыре указывают, что одно из возможных значений в строке 1 равно нулю.

Поэтому я пытаюсь использовать следующие строки кода для поиска и удаления строк, содержащих нулевые значения.

 for q in range(len(NumNonzeroElementsInRows)): if NumNonzeroElementsInRows[q] < NumNonzeroElementsInRows.max(): p.delete(ANOVAInputMatrixValuesArray, q, axis=0) 

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

Должен быть простой способ просто «удалить любую строку, содержащую нулевое значение».

Может ли кто-нибудь показать мне, какой код писать для этого?

4 Solutions collect form web for “удаление строк в массиве numpy”

Самый простой способ удалить строки и столбцы из массивов – это метод numpy.delete .

Предположим, что у меня есть следующий массив x :

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

Чтобы удалить первую строку, выполните следующие действия:

 x = numpy.delete(x, (0), axis=0) 

Чтобы удалить третий столбец, выполните следующие действия:

 x = numpy.delete(x,(2), axis=1) 

Таким образом, вы можете найти индексы строк, которые имеют в них 0, поместить их в список или кортеж и передать это как второй аргумент функции.

Вот один вкладыш (да, он похож на user333700, но немного более простой):

 >>> import numpy as np >>> arr = np.array([[ 0.96488889, 0.73641667, 0.67521429, 0.592875, 0.53172222], [ 0.78008333, 0.5938125, 0.481, 0.39883333, 0.]]) >>> print arr[arr.all(1)] array([[ 0.96488889, 0.73641667, 0.67521429, 0.592875 , 0.53172222]]) 

Кстати, этот метод намного, намного быстрее, чем метод маскированных массивов для больших матриц. Для матрицы 2048 x 5 этот метод примерно в 1000 раз быстрее.

Кстати, метод user333700 (из его комментария) был немного быстрее в моих тестах, хотя это пугает мой разум, почему.

Это похоже на ваш оригинальный подход и будет использовать меньше места, чем ответ unutbu , но я подозреваю, что он будет медленнее.

 >>> import numpy as np >>> p = np.array([[1.5, 0], [1.4,1.5], [1.6, 0], [1.7, 1.8]]) >>> p array([[ 1.5, 0. ], [ 1.4, 1.5], [ 1.6, 0. ], [ 1.7, 1.8]]) >>> nz = (p == 0).sum(1) >>> q = p[nz == 0, :] >>> q array([[ 1.4, 1.5], [ 1.7, 1.8]]) 

Кстати, ваша строка p.delete() не работает для меня – у ndarray s нет атрибута .delete .

numpy предоставляет простую функцию для выполнения той же самой вещи: предположим, что у вас есть маскированный массив a, вызывающий numpy.ma.compress_rows (a) удалит строки, содержащие маскированное значение. Думаю, это намного быстрее …

Interesting Posts
Python - лучший язык программирования в мире.