#python #numpy
#python #numpy
Вопрос:
У меня есть массив numpy следующим образом.
import numpy as np
data = np.array([[0,0,0,4],
[3,0,5,0],
[8,9,5,3]])
print (data)
Я должен извлекать только те строки, первые три элемента которых не все нули
ожидаемый результат выглядит следующим образом:
result = np.array([[3,0,5,0],
[8,9,5,3]])
Я пытался как:
res = [l for l in data if l[:3].sum() !=0]
print (res)
Это дает результат. Но, ища лучший, простой способ сделать это.
Комментарии:
1. да, ищу простой способ….
Ответ №1:
sum
немного ненадежно, если ваш массив может содержать отрицательные числа, но any
всегда будет работать:
result = data[data[:, :3].any(1)]
Ответ №2:
Вы говорите
первые три элемента не все нули
таким образом, решение
import numpy as np
data = np.array([[0,0,0,4],
[3,0,5,0],
[8,9,5,3]])
data[~np.all(data[:, :3] == 0, axis=1), :]
Комментарии:
1. «Не все» — это «любые» с большим количеством шагов и временных массивов
Ответ №3:
Я постараюсь объяснить, как я думаю о подобных проблемах, в своем ответе.
Первый шаг: определите функцию, которая возвращает логическое значение, указывающее, является ли это хорошей строкой. Для этого я использую np.any , который проверяет, является ли какая-либо из записей «Истинной» (для целых чисел true не равно нулю).
import numpy as np
v1 = np.array([1, 1, 1, 0])
v2 = np.array([0, 0, 0, 1])
good_row = lambda v: np.any(v[:3])
good_row(v1)
Out[28]: True
good_row(v2)
Out[29]: False
Второй шаг: я применяю это ко всем строкам и получаю маскирующий вектор. Для этого можно использовать ключевое слово ‘axis’ в ‘np.any’, которое будет применять это к столбцам или строкам в зависимости от значения оси.
np.any(data[:, :3], axis=1)
Out[32]: array([False, True, True])
Заключительный шаг: я объединяю это с индексацией, чтобы обернуть все это.
rows_inds = np.any(data[:, :3], axis=1)
data[rows_inds]
Out[37]:
array([[3, 0, 5, 0],
[8, 9, 5, 3]])