Подтвердить что ты не робот

Разница между bypyfunc и векторизация в numpy

В чем разница между vectorize и frompyfunc в numpy?

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

Изменить. Как указывает JoshAdel, класс vectorize, по-видимому, построен на frompyfunc. (см. источник). Мне все еще неясно, может ли frompyfunc использовать любой случай, который не покрывается vectorize...

4b9b3361

Ответ 1

Как указывает JoshAdel, vectorize wraps frompyfunc. Vectorize добавляет дополнительные функции:

  • Копирует docstring из исходной функции
  • Позволяет исключить аргумент из правил вещания.
  • Возвращает массив правильного 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)

`

Ответ 2

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

Ответ 3

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