Numpy Broadcasting для пользовательских функций

1

В numpy, если a является ndarray, то что-то вроде np.sin(a) принимает sin всех записей ndarray. Что делать, если мне нужно определить мою собственную функцию (для глупого примера, f(x) = sin(x) if x<1 else cos(x)) с режимом вещания?

  • 0
    Возможно, вы представляете проблему XY с вашим «глупым» примером. Возможно, если вы скажете, что вы на самом деле пытаетесь сделать, мы могли бы лучше векторизоваться?
  • 0
    @DanielF Что такое "проблема XY"?
Теги:
numpy
python-3.x

2 ответа

2
Лучший ответ

Вы можете определить свою собственную функцию f = lambda x: sin(x) if x<1 else cos(x) а затем использовать numpy builtin f_broadcasting = np.vectorize(f).

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

  • 0
    Это отвечает на мой реальный вопрос (хотя я имел в виду что-то вроде других адресов ответов ...), спасибо! Я боялся проблемы с производительностью ...
2

Используйте 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

  • 1
    Я немного озадачен поведением этого. Если вы установите a = np.array([[1, 0], [3, 4]]) а затем np.where (a == 0, 0, 1 / a), вы получите предупреждение о делении на ноль ( конечный результат является правильным), что заставляет думать, что на самом деле это в 2 раза больше необходимой работы. Это верно?
  • 1
    Интересно отметить! Я предполагаю, что он выполняет операцию со всем массивом, но возвращает его только тогда, когда условие выполнено (или не выполнено) ... Я не знаю внутреннюю работу, но функция часто достаточно эффективна для меня.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню