Ошибка утверждения с jit от numba и hypergeom от scipy - PullRequest
1 голос
/ 14 июля 2020

Я пытаюсь использовать эту функцию:

@jit
def pv (matrix1, matrix2, vec, n):
    for i in range (n):
        for j in range (n):
            matrix1[i,j] = 1 - sum (hypergeom.pmf(X, n, int(vec[i]), int(vec[j])) for X in range(matrix2[i,j]))

, но у меня ошибка утверждения , многое я даже не понимаю (трассировка от numba) и в конце AssertionError: сбой в конвейере объектного режима (шаг: интерфейс объектного режима) . Я подозреваю, что это что-то связано с hyergeom, но я не вижу, где я ошибся

Изменить: в конце концов я не нашел способа реализовать код, работающий с @jit, но я считаю функцию scipy. stats.hypergeom.cdf, который делает это:

sum (hypergeom.pmf(X, n, int(vec[i]), int(vec[j])) for X in range(matrix2[i,j]))
from scipy.stats import hypergeom

hypergeom.cdf(m2[i,j], n, v[i], v[j])

Хотя это решение ускорило код, циклы for по-прежнему очень медленные (при n = 5053 для запуска требуется более получаса)

1 Ответ

2 голосов
/ 14 июля 2020

Отличная идея использовать Numba для такого рода вещей, но, к сожалению, как вы подозреваете, он не поддерживает функцию hypergeom. Вы не сделали здесь ничего плохого - он просто не поддерживается, поэтому я думаю, что вы не сможете использовать Numba в этом случае.

Список того, что поддерживается, находится на https://numba.pydata.org/numba-doc/latest/reference/numpysupported.html

Подход, который я использовал в прошлом, когда что-то подобное происходит, - это попытаться написать мою собственную версию неподдерживаемой функции, используя подмножество numpy, которое numba выполняет поддержка, но вероятность успеха варьируется, и это может вызвать целый ряд новых проблем (замена отлаженной, протестированной библиотечной функции для вашей собственной реализации чего-либо может привести к возгоранию мусорного контейнера). Не глядя на источник hypergeom.pmf, я понятия не имею, будет ли этот путь здесь жизнеспособным.

...