удаление строк в массиве NumPy - PullRequest
78 голосов
/ 07 октября 2010

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

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)

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

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

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

Ответы [ 6 ]

139 голосов
/ 26 июля 2012

Самый простой способ удалить строки и столбцы из массивов - это метод 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, поместить их в список или кортеж и передать это как второй аргумент функции.

13 голосов
/ 07 октября 2010

Вот один вкладыш (да, он похож на 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 (из его комментария) был немного быстрее в моих тестах, хотя мне непонятно, почему.

5 голосов
/ 07 октября 2010

Это похоже на ваш первоначальный подход и использует меньше места, чем ответ 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.

2 голосов
/ 21 апреля 2011

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

1 голос
/ 20 августа 2018
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[np.where(arr != 0.)])
0 голосов
/ 05 марта 2018

Я мог бы опоздать с ответом на этот вопрос, но хотел бы поделиться своим мнением на благо сообщества. Для этого примера позвольте мне назвать вашу матрицу «ANOVA», и я предполагаю, что вы просто пытаетесь удалить строки из этой матрицы с нулями только в 5-м столбце.

indx = []
for i in range(len(ANOVA)):
    if int(ANOVA[i,4]) == int(0):
        indx.append(i)

ANOVA = [x for x in ANOVA if not x in indx]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...