Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

numpy arbitrary precision linear algebra

I have a numpy 2d array [medium/large sized - say 500x500]. I want to find the eigenvalues of the element-wise exponent of it. The problem is that some of the values are quite negative (-800,-1000, etc), and their exponents underflow (meaning they are so close to zero, so that numpy treats them as zero). Is there anyway to use arbitrary precision in numpy?

The way I dream it:

import numpy as np

np.set_precision('arbitrary') # <--- Missing part
a = np.array([[-800.21,-600.00],[-600.00,-1000.48]])
ex = np.exp(a)  ## Currently warns about underflow
eigvals, eigvecs = np.linalg.eig(ex)

I have searched for a solution with gmpy and mpmath to no avail. Any idea will be welcome.

like image 632
jarondl Avatar asked Jul 29 '11 16:07

jarondl


People also ask

Is NumPy good for linear algebra?

Data Science relies heavily on Linear Algebra. NumPy offers array-like data structures & dedicated operations and methods for Linear Algebra. NumPy is an essential Python library to perform mathematical and scientific computations.

Does Python have arbitrary precision?

Generally, In low-level languages like C, the precision of integers is limited to 64-bit, but Python implements Arbitrary-precision integers. Since Python 3 all integers are represented as a bignum and these are limited only by the available memory of the host system.

How are NumPy used in linear algebra?

Numpy provides the following functions to perform the different algebraic calculations on the input data. It is used to calculate the dot product of two arrays. It is used to calculate the dot product of two vectors.


1 Answers

SymPy can calculate arbitrary precision:

from sympy import exp, N, S
from sympy.matrices import Matrix

data = [[S("-800.21"),S("-600.00")],[S("-600.00"),S("-1000.48")]]
m = Matrix(data)
ex = m.applyfunc(exp).applyfunc(lambda x:N(x, 100))
vecs = ex.eigenvects()
print vecs[0][0] # eigen value
print vecs[1][0] # eigen value
print vecs[0][2] # eigen vect
print vecs[1][2] # eigen vect

output:

-2.650396553004310816338679447269582701529092549943247237903254759946483528035516341807463648841185335e-261
2.650396553004310816338679447269582701529092549943247237903254759946483528035516341807466621962539464e-261
[[-0.9999999999999999999999999999999999999999999999999999999999999999999999999999999999999994391176386872]
[                                                                                                      1]]
[[1.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000560882361313]
[                                                                                                    1]]

you can change 100 in N(x, 100) to other precision, but, as I tried 1000, the calculation of eigen vect failed.

like image 60
HYRY Avatar answered Oct 13 '22 01:10

HYRY