Numpy массив: как извлечь целые строки на основе значений в столбце - PullRequest
0 голосов
/ 04 апреля 2020

Я ищу эквивалент SQL запроса 'where' к таблице. Я много занимался поиском и либо использую неправильные условия поиска, либо не понимаю ответы. Вероятно, оба.

Таким образом, таблица представляет собой двумерный массив numpy.

my_array = np.array([[32, 55,  2],
                     [15,  2, 60], 
                     [76, 90,  2], 
                     [ 6, 65,  2]])

I 'sh, чтобы "закончить" массивом numpy той же формы где, например, значения второго столбца:> = 55 AND <= 65. </p>

Таким образом, мой желаемый массив numpy будет ...

desired_array([[32, 55,  2],
               [ 6, 65,  2]])

Кроме того, соответствует ли искомый порядок строк 'required_array' 'my_array' заказ?

Ответы [ 4 ]

2 голосов
/ 04 апреля 2020

Просто сделай маску и используй ее.

mask = np.logical_and(my_array[:, 1] >= 55, my_array[:, 1] <= 65)
desired_array = my_array[mask]
desired_array
0 голосов
/ 04 апреля 2020

Вы не имеете в виду ту же форму. Вы, вероятно, имели в виду тот же размер столбца. Форма my_array - (4, 3), а желаемый массив - (2, 3). Я бы тоже порекомендовал маскировку.

0 голосов
/ 04 апреля 2020

Общий Numpy подход к фильтрации массива состоит в том, чтобы создать «маску», соответствующую требуемой части массива, а затем использовать ее для индексации.

>>> my_array[((55 <= my_array) & (my_array <= 65))[:, 1]]
array([[32, 55,  2],
       [ 6, 65,  2]])

Разбить ее:

# Comparing an array to a scalar gives you an array of all the results of
# individual element comparisons (this is called "broadcasting").
# So we take two such boolean arrays, resulting from comparing values to the
# two thresholds, and combine them together.
mask = (55 <= my_array) & (my_array <= 65)

# We only want to care about the [1] element in the second array dimension,
# so we take a 1-dimensional slice of that mask.
desired_rows = mask[:, 1]

# Finally we use those values to select the desired rows.
desired_array = my_array[desired_rows]

(Первые две операции можно было бы поменять местами - таким образом, я думаю, что это более эффективно, но это не имеет значения для чего-то такого маленького. Этот способ был первым, что пришло мне в голову.)

0 голосов
/ 04 апреля 2020

Вы можете использовать оператор filter с lambda, который проверяет каждую строку на наличие требуемого условия, чтобы получить желаемый результат:

my_array = np.array([[32, 55,  2],
                     [15,  2, 60], 
                     [76, 90,  2], 
                     [ 6, 65,  2]])

desired_array = np.array([l for l in filter(lambda x: x[1] >= 55 and x[1] <= 65, my_array)])

После выполнения этого мы получаем:

>>> desired_array
array([[32, 55,  2],
       [ 6, 65,  2]])
...