Динамически добавлять к условию в numpy .where - PullRequest
1 голос
/ 24 марта 2020

В зависимости от пользовательского ввода, у меня есть разные условия для проверки в моем массиве. Предположим, что существует максимум 3 условия:

a должно быть 1

b должно быть положительным

c должно быть True

Только в тех случаях, когда эти три условия оцениваются как True, массив должен обрабатываться:

myArr = np.random.rand(5)
a = np.array([1, 1, 1, 0, 1])
b = np.array([4, 3, -8, 7, 6])
c = np.array([True, False, True, True, True])
valid_indices = np.where((a == 1) & (b > 0) & (c == True))

>> valid_indices
>> Out: (array([0, 4], dtype=int64),)

Не зная заранее, какое из этих условий будет предоставлено, я должен был бы проверить так:

if a and not b and not c:
    valid_indices = np.where(a == 1)

elif a and not b and c:
    valid_indices = np.where((a == 1) & (c == True))

elif a and b and not c:
    valid_indices = np.where((a == 1) & (b > 0))

elif not a and b and c:
    valid_indices = np.where((b > 0) & (c == True))

elif not a and not b and c:
    valid_indices = np.where(c == True)

elif not a and b and not c:
    valid_indices = np.where((b > 0))

Не дай Бог, я добавлю еще одно условие. Вещи становятся действительно грязными. Я ищу способ динамического добавления к условию, как если бы это была обычная строка или средство форматирования. Это возможно?

Ответы [ 2 ]

2 голосов
/ 24 марта 2020

Если вы установите по умолчанию истинное условие:

import numpy as np


myArr = np.random.rand(5)

a = np.array([1, 1, 1, 0, 1])
b = np.array([4, 3, -8, 7, 6])
c = np.array([True, False, True, True, True])


def get_id(**kwargs):
    """ a must be 1, b must be positive, c must be True """
    a = kwargs.get("a", np.ones(5))
    b = kwargs.get("b", np.ones(5))
    c = kwargs.get("c", np.ones(5) == 1)
    return np.where((a == 1) & (b > 0) & c)


print(get_id(a=a))
print(get_id(a=a, c=c))
print(get_id(a=a, b=b))
print(get_id(a=a, b=b, c=c))


(array([0, 1, 2, 4]),)
(array([0, 2, 4]),)
(array([0, 1, 4]),)
(array([0, 4]),)
1 голос
/ 24 марта 2020

Может быть что-то вроде следующего может помочь:

myArr = np.random.rand(5)
size = myArr.size
all_true = np.repeat(True, size)

a = np.array([1, 1, 1, 0, 1])
b = np.array([4, 3, -8, 7, 6])
c = np.array([True, False, True, True, True])

valid_indices = np.where((a == 1 if 'a' in locals() else all_true) & 
                         (b > 0 if 'b' in locals() else all_true) & 
                         (c == True if 'c' in locals() else all_true))

Таким образом, вы можете записать все условия и только проверить, существует ли переменная в локальных вариабельных значениях по 'a' in locals(). Если вы определяете a, b и c где-то и ссылаетесь на них в функции, вы можете проверить, определены ли они в глобальной среде, используя 'a' in globals().

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