numpy.linalg.det квадратного массива mpmath.mpfs

У меня возникла следующая проблема:

>>> import numpy as np
>>> import mpmath as mp
>>> v1 = [mp.mpf(1), mp.mpf(2)]
>>> v2 = [mp.mpf(3), mp.mpf(4)]
>>> np.dot(v1,v2)
mpf('11.0')
>>> M2 = [[mp.mpf(1), mp.mpf(2)], [mp.mpf(3), mp.mpf(4)]]
>>> np.linalg.det(M2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "~/anaconda/lib/python2.7/site-packages/numpy/linalg/linalg.py", line 1776, in det
    r = _umath_linalg.det(a, signature=signature)
TypeError: No loop matching the specified signature and casting
was found for ufunc det

Мои вызовы метода linalg.det numpy отлично работают с записями, отличными от mpmath, но я получаю указанную выше ошибку, когда даю ему mp.mpfs. Старый вопрос Взаимодействие между Numpy и MpMath в Python указывает, что np.dot будет работает нормально, если записи mp.mpfs (подтверждено выше), поэтому мой вопрос в том, почему это не переносится на np.linalg.det, и что я могу сделать, чтобы обойти это. Контекст таков, что я уже написал большой объем кода, используя только numpy (без mpmath), и только что понял, что мне потребуется гораздо более высокая числовая точность, поэтому в идеале существует решение, которое не требует преобразования всего кода numpy.

Заранее спасибо за любые ответы.


person zjs    schedule 17.05.2021    source источник
comment
Судя по ссылке, у dot есть ветка, которая умеет работать с объектными массивами dtype, правда скорость значительно меньше, чем с числовыми dtypes. det такой возможности нет. Он использует только скомпилированный числовой код. Математика с массивами объектов dtype выполняется наугад и всегда медленнее.   -  person hpaulj    schedule 17.05.2021
comment
@hpaulj Хорошо, похоже, что нет хорошего обходного пути для mpmath. Есть ли другая библиотека для более высокой числовой точности, которая лучше взаимодействует с методами numpy?   -  person zjs    schedule 17.05.2021
comment
Почему бы не использовать mpmath.det?   -  person Warren Weckesser    schedule 17.05.2021
comment
Ах, я не знал, что mp.det совместим с np.array, но теперь я вижу, что это должно работать. Вычисление инверсий все еще может быть проблемой (поскольку mpmath рассматривает инверсию как атрибут или из **-1), но я, вероятно, смогу обойти это. Спасибо вам обоим за то, что указали мне правильное направление!   -  person zjs    schedule 19.05.2021