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