У меня есть массив, который может выглядеть так:
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)
Но по какой-то причине этот код, похоже, ничего не делает, хотя выполнение большого количества команд печати указывает на то, что все переменные, похоже, заполняются правильно, вплоть до кода.
Должен быть какой-то простой способ просто «удалить любую строку, содержащую нулевое значение».
Может ли кто-нибудь показать мне, какой код написать для этого?
источник
numpy.delete(x, index)
не удалось.Вот один лайнер (да, он похож на 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 (из его комментария) был немного быстрее в моих тестах, хотя я не понимаю, почему.
источник
any
замыкание на истину при первом обнаруженном истинном случае;all
короткое замыкание на ложь при первом обнаруженном ложном случае. В этом случае короткое замыкание должно быть ничьей, но, на мой взгляд, дополнительные действия не должны замедлить его.Это похоже на ваш исходный подход и будет занимать меньше места, чем ответ 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) удалит строки, содержащие замаскированное значение. Я думаю, это намного быстрее ...
источник
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.)])
источник
Я мог бы слишком поздно ответить на этот вопрос, но хотел поделиться своим мнением на благо сообщества. В этом примере позвольте мне назвать вашу матрицу «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]
источник