В numpy, если a является ndarray, то что-то вроде np.sin(a) принимает sin всех записей ndarray.Что если мне нужно определить свою собственную функцию (для глупого примера, f(x) = sin(x) if x<1 else cos(x)) с широковещательным поведением?
numpy
a
np.sin(a)
sin
f(x) = sin(x) if x<1 else cos(x)
Использование np.where:
np.where
np.where(a<1,np.cos(a), np.sin(a))
Пример:
a = [-1,1,2,-2] >>> np.where(a<1,np.cos(a), np.sin(a)) array([-0.84147098, 0.84147098, 0.90929743, -0.90929743])
Если у вас более одного условия, используйте np.select
np.select
Вы можете определить свою собственную функцию f = lambda x: sin(x) if x<1 else cos(x), а затем использовать встроенный векторизатор numpy f_broadcasting = np.vectorize(f).
f = lambda x: sin(x) if x<1 else cos(x)
f_broadcasting = np.vectorize(f)
Это не дает никаких улучшений скорости (а дополнительные издержки могут замедлить небольшие проблемы), но этодает желаемое поведение при вещании.