Если диапазон одинаков для обоих направлений, x и y, просто сравните их и используйте all
:
import numpy as np
a = np.array([[-1,2], [1,5], [6,7], [5,2], [3,4], [0, 0], [-1,-1]])
a[(a >= 0).all(axis=1) & (a <= 4).all(axis=1)]
# array([[3, 4],
# [0, 0]])
Если диапазоны не совпадают, вы также можете сравнить ситерируемый с тем же размером, что и эта ось (здесь их два):
mins = 0, 1 # x_min, y_min
maxs = 4, 10 # x_max, y_max
a[(a >= mins).all(axis=1) & (a <= maxs).all(axis=1)]
# array([[1, 5],
# [3, 4]])
Чтобы увидеть, что здесь происходит, давайте посмотрим на промежуточные шаги:
Сравнениедает результат сравнения для каждого элемента с той же формой, что и исходный массив:
a >= mins
# array([[False, True],
# [ True, True],
# [ True, True],
# [ True, True],
# [ True, True],
# [ True, False],
# [False, False]], dtype=bool)
Используя nmpy.ndarray.all
, вы получаете, если все значения верны или нет, аналогично встроенной функцииall
:
(a >= mins).all()
# False
С аргументом axis
вы можете ограничить это только сравнением значений по одной (или нескольким) осям массива:
(a >= mins).all(axis=1)
# array([False, True, True, True, True, False, False], dtype=bool)
(a >= mins).all(axis=0)
# array([False, False], dtype=bool)
Обратите внимание, чтовыходные данные этого объекта имеют ту же форму, что и массив, за исключением того, что все размеры, указанные с axis
, сокращены до одного True
/ False
.
При индексации массива с последовательностью True, False
значения, это приведено к правильной форме, если это возможно.Поскольку мы индексируем массив с формой (7, 2)
с индексом (7,) = (7, 1)
, значения неявно повторяются по второму измерению, поэтому эти значения используются для выбора строк исходного массива.