вещание и условные трансляции - PullRequest
2 голосов
/ 04 ноября 2019

Я уверен, что вопрос уже где-то задавался, но у меня нет подходящих ключевых слов, чтобы найти решение ...

Моя проблема заключается в улучшении следующего кода:

I = np.array([True,False])
x = np.array([1,2])
result = f(x) * (1 - I) + g(x) * I

Где на самом деле I используется в качестве условного: сделайте первое, если я истинен, иначе сделайте второе. f и g должны быть (2,) -> (2,) функциями.

Есть ли способ, которым я мог бы написать это так, чтобы 2 функции f и gВычисляются только при необходимости, а не везде? Здесь у меня есть 2 значения, но в приложении у меня есть сотни и тысячи функций.

1 Ответ

2 голосов
/ 04 ноября 2019

np.piecewise это, вероятно, то, что вы хотите. Например:

I = np.array([True,False])
x = np.array([1,2])
f,g = np.square,np.negative
np.piecewise(x, I, [g,f])
# array([-1,  4])

Одна потенциальная ошибка: вывод np.piecewise имеет тот же тип, что и x;поэтому, если x равно int, но выдает float значения, они усекаются. Чтобы избежать этого приведения X к float или как угодно.

...