Элегантный способ проверки координат двумерного массива NumPy лежит в определенном диапазоне - PullRequest
1 голос
/ 07 марта 2019

Итак, допустим, у нас есть двумерный массив NumPy (обозначающий координаты), и я хочу проверить, лежат ли все координаты в определенном диапазоне. Какой самый питонский способ сделать это? Например:

a = np.array([[-1,2], [1,5], [6,7], [5,2], [3,4], [0, 0], [-1,-1]])

#ALL THE COORDINATES WITHIN x-> 0 to 4 AND y-> 0 to 4 SHOULD
 BE PUT IN b (x and y ranges might not be equal)

b = #DO SOME OPERATION
>>> b
>>> [[3,4],
    [0,0]]

1 Ответ

2 голосов
/ 07 марта 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...