Документы для numpy.vectorize
состояния:
Тип вывода определяется путем оценки первого элемента ввода, если он не указан
Поскольку вы не указали тип возвращаемых данных, а первый пример - целочисленное умножение, первый массив также имеет целочисленный тип и округляет значения. И наоборот, когда первой операцией является деление, тип данных автоматически преобразуется в плавающее. Вы можете исправить свой код, указав dtype в vector_function
(который необязательно должен быть таким же большим, как 64-битный для этой проблемы):
def vector_function(x, y):
"""
Make it possible to accept vectors as input
"""
v_scalar_function = np.vectorize(scalar_function, otypes=[np.float64])
return v_scalar_function(x, y)
Отдельно вы также должны сделать заметку из та же самая документация о том, что numpy.vectorize
является вспомогательной функцией и в основном просто оборачивает Python for
l oop, поэтому не векторизована в том смысле, что она обеспечивает какой-либо реальный прирост производительности.
Для бинарный выбор, подобный этому, лучший общий подход будет выглядеть так:
def vectorized_scalar_function(arr_1, arr_2):
return np.where(arr_1 < arr_2, arr_1 * arr_2, arr_1 / arr_2)
print(vectorized_scalar_function(np.array([4,4]), np.array([4,3])))
print(vectorized_scalar_function(np.array([3,4]), np.array([4,3])))
Выше должно быть на несколько порядков быстрее и (возможно, по совпадению, а не по жесткому правилу, на которое можно положиться) не страдает проблема приведения типа для результата.