Извлечение numpy строк по заданному условию

#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]])