Как numpy frompyfunc генерирует ufunc, образуя функцию python, содержащую операторы if? - PullRequest
0 голосов
/ 01 мая 2018

Я написал следующий пример кода, и мне немного любопытно, как будет np.frompyfunc работать в этом случае.

import numpy as np
def test(x):
    if x>10000:
        return test(x)
    else:
        return x+1
def f(x, y):
    if y >5:
        x=test(x)
        return x/y
    if x<5:
        y+=1
        return x*y
    return x*y*2

vf = np.frompyfunc(f,2,1)
print(vf(np.arange(10),np.arange(10,0,-1)))

Я предполагаю, что это как-то "сгладит" оператор IF в функции и приведет к векторизованному коду, но я не смог найти соответствующий код в репозитории с тупым кодом.

1 Ответ

0 голосов
/ 01 мая 2018

frompyfunc не может проанализировать вашу функцию или неявно векторизовать ее выполнение. Его реализация в основном представляет собой цикл for, вызывающий вашу функцию несколько раз.

Здесь - это ссылка на реализацию самого frompyfunc, хотя большинство интересующих вас частей там не встречаются. Здесь - ссылка на один из внутренних циклов ufunc, используемых для ufuncs, созданных из объектов Python; Я верю, что frompyfunc будет использовать этот или один из циклов чуть выше его в исходном коде. Вы можете увидеть повторное использование PyEval_CallObject для вызова вызываемого Python.

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