Удаление строк в массиве numpy - программирование
Подтвердить что ты не робот

Удаление строк в массиве 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)

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

>>> 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 не имеет атрибута .delete.

Ответ 4

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