Как напечатать элементы нескольких массивов с numpy .logical_and? - PullRequest
1 голос
/ 12 февраля 2020

Я довольно новичок в python, и у меня возник вопрос о np.logical_ функциях, в частности np.logical_and(). Как я могу отобразить элементы, для которых логическое значение истинно для двух отдельных массивов? Возьмите приведенный ниже код в качестве примера:

# create arrays:
import numpy as np
my_house = np.array([18.0, 20.0, 10.75, 9.50])
your_house = np.array([14.0, 24.0, 14.25, 9.0])

# (1) find which areas of my_house are greater than 18.5 or smaller than 10:

print(np.logical_or(my_house>18.5, my_house<10))
# this results in: [False  True False  True]

print(my_house[np.logical_or(my_house>18.5,my_house<10)])
# this results in: [20.   9.5], giving the elements for which the boolean is true. 

# (2) find the areas of both my_house and your_house which are smaller than 11:

print(np.logical_and(my_house<11,your_house<11))
# this results in [False False False  True]

как я могу написать код, который возвращает элементы для обоих массивов, для которых логическое значение верно в вопросе 2? В первом вопросе я мог сделать это с my_house[np.logical_()]. Но как я могу это сделать, когда я звоню на номера my_house и your_house? Или это невозможно?

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Как обычно это делается в векторизованном виде / numpy:

>>> table = np.column_stack([my_house, your_house])
>>> table
array([[18.  , 14.  ],
       [20.  , 24.  ],
       [10.75, 14.25],
       [ 9.5 ,  9.  ]])
>>> idx = np.logical_and(my_house<11, your_house<11)
>>> idx
array([False, False, False,  True])
>>> table[idx]
array([[9.5, 9. ]])

Основное преимущество здесь в том, что вы можете получить доступ к элементам таблицы, используя булевы или целочисленные индексы одновременно, плюс это работает намного быстрее чем использование списка пониманий.

0 голосов
/ 12 февраля 2020

Вот понимание списка, которое делает то, что вы ищете:

x = [[my_house[i],your_house[i]] for i in range(len(my_house)) if 
    np.logical_and(my_house<11,your_house<11)[i] == True]
# output: [[9.5, 9.0]]

Это предполагает, что my_house и your_house имеют одинаковую длину. Он перебирает оба массива, применяя ваши np.logical критерии. Для значения True он хранит значения из my_house и your_house.

Вот расширенный код из списка, который делает то же самое:

for i in range(len(my_house)):
    if np.logical_and(my_house<11,your_house<11)[i] == True:
        print(my_house[i], your_house[i])
# output: 9.5, 9.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...