Разница между frompyfunc и векторизацией в numpy - PullRequest
28 голосов
/ 21 июля 2011

В чем разница между векторизация и от pyfunc в numpy?

Оба кажутся очень похожими.Каков типичный вариант использования для каждого из них?

Редактировать : Как указывает ДжошАдель, класс vectorize, кажется, построен на frompyfunc.(см. источник ).Мне все еще неясно, может ли frompyfunc иметь какой-либо вариант использования, который не охватывается vectorize ...

Ответы [ 3 ]

15 голосов
/ 22 июня 2012

Как указывает Джош Адель, vectorize оборачивает frompyfunc. Vectorize добавляет дополнительные функции:

  • Копирует строку документации из исходной функции
  • Позволяет исключить аргумент из правил трансляции.
  • Возвращает массив правильного dtype вместо dtype = object

Редактировать: После небольшого тестирования я обнаружил, что vectorize значительно медленнее (~ 50%), чем frompyfunc для больших массивов. Если производительность важна для вашего приложения, сначала сравните ваш пример использования.

`

>>> a = numpy.indices((3,3)).sum(0)

>>> print a, a.dtype
[[0 1 2]
 [1 2 3]
 [2 3 4]] int32

>>> def f(x,y):
    """Returns 2 times x plus y"""
    return 2*x+y

>>> f_vectorize = numpy.vectorize(f)

>>> f_frompyfunc = numpy.frompyfunc(f, 2, 1)
>>> f_vectorize.__doc__
'Returns 2 times x plus y'

>>> f_frompyfunc.__doc__
'f (vectorized)(x1, x2[, out])\n\ndynamic ufunc based on a python function'

>>> f_vectorize(a,2)
array([[ 2,  4,  6],
       [ 4,  6,  8],
       [ 6,  8, 10]])

>>> f_frompyfunc(a,2)
array([[2, 4, 6],
       [4, 6, 8],
       [6, 8, 10]], dtype=object)

`

8 голосов
/ 21 июля 2011

Я не уверен, каковы различные варианты использования для каждого, но если вы посмотрите на исходный код (/numpy/lib/function_base.py), вы увидите, что vectorize включает frompyfuncМое чтение кода в основном состоит в том, что vectorize правильно обрабатывает входные аргументы.В некоторых случаях вы бы предпочли одно против другого, но может показаться, что frompyfunc - это просто экземпляр более низкого уровня vectorize.

2 голосов
/ 17 декабря 2016

Хотя оба метода предоставляют вам способ создания собственного ufunc , numpy.frompyfunc метод всегда возвращает объект Python, в то время как вы можете указать тип возврата при использовании numpy.vectorize method

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...