Python: инвертирует матрицу с плавающими числами высокой точности

#python #numpy #floating-point #precision #gmpy

#python #numpy #с плавающей запятой #точность #gmpy

Вопрос:

Я следую руководству о том, как работать с арифметикой с множественной точностью в Python.
В конце я хотел бы иметь numpy массив с плавающими числами произвольной высокой точности, и мне нужно инвертировать эту матрицу.

Поэтому мы имеем:

 import sys
import numpy as np
import gmpy2

print(sys.version)
print(np.__version__)
print(gmpy2.version)
  
 3.6.10 | packaged by conda-forge | (default, Apr 24 2020, 16:27:41) 
[GCC Clang 9.0.1 ]
1.12.1
<built-in function version>
  

С последующей генерацией данных:

 A = np.ones((3,3));
B = A/gmpy2.mpfr("1.0")
print(A)
print(B)
  
 [[ 1.  1.  1.]
 [ 1.  1.  1.]
 [ 1.  1.  1.]]
[[mpfr('1.0') mpfr('1.0') mpfr('1.0')]
 [mpfr('1.0') mpfr('1.0') mpfr('1.0')]
 [mpfr('1.0') mpfr('1.0') mpfr('1.0')]]
  

И проблемная часть:

 print(np.linalg.pinv(B))
  
 ---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-23-3a70ff54e53d> in <module>
----> 1 print(np.linalg.pinv(B))

~/conda-envs/Python_Jupyter/env/lib/python3.6/site-packages/numpy/linalg/linalg.py in pinv(a, rcond)
   1660     _assertNoEmpty2d(a)
   1661     a = a.conjugate()
-> 1662     u, s, vt = svd(a, 0)
   1663     m = u.shape[0]
   1664     n = vt.shape[1]

~/conda-envs/Python_Jupyter/env/lib/python3.6/site-packages/numpy/linalg/linalg.py in svd(a, full_matrices, compute_uv)
   1402 
   1403         signature = 'D->DdD' if isComplexType(t) else 'd->ddd'
-> 1404         u, s, vt = gufunc(a, signature=signature, extobj=extobj)
   1405         u = u.astype(result_t, copy=False)
   1406         s = s.astype(_realType(result_t), copy=False)

TypeError: No loop matching the specified signature and casting
was found for ufunc svd_n_s
  

Кто-нибудь знает, как достичь цели, к которой я стремлюсь?

Комментарии:

1. np.linalg вероятно, возникли проблемы с массивом с object dtype, то есть элементами, которые не являются числовыми типами, используемыми в его скомпилированном коде. sympy используйте mpmath для ее высокоточной числовой работы, но я не знаю, что это имеет для инверсии матрицы.

2. Это может помочь узнать, какой учебник вы используете, и какая часть этой конкретной задачи берется оттуда. Они действительно предлагают использовать pinv ? а в единственном массиве?

Ответ №1:

Мне удалось инвертировать матрицу с очень точными числами, mpmath которая содержит множество встроенных математических функций, а также класс matrix. Спасибо за комментарии!