2012-12-06 27 views
8

ich habe:Wie mpf ein Array?

import numpy as np 
from mpmath import * 

mpf(np.array(range(0,600))) 

Aber es wird mir es nicht zulassen:

TypeError: cannot create mpf from array 

Also, was soll ich tun?

Im Wesentlichen werde ich dieses Array verwenden und elementweise mit einer unglaublich großen oder unglaublich kleinen Zahl multiplizieren, abhängig von den Umständen (zB 1.35626567e1084 oder 6.2345252e-2732), daher die Notwendigkeit für mpf.

Genauer gesagt werde ich die besseli und besselk Funktion verwenden, die die unglaublich großen und unglaublich kleinen Werte schaffen.

Wie bekomme ich ein mpf-Array, um diese Zahlen zu halten?

Antwort

11

ein Array von einer MPF Zahl Multipliziert funktioniert:

import numpy as np 
import mpmath as mp 
small_number = mp.besseli(400, 2) # This is an mpf number 
# Note that creating a list using `range` and then converting it 
# to an array is not very efficient. Do this instead: 
A = np.arange(600) 
result = small_number * A # Array of dtype object, ie, it contains mpf numbeers 

Multipliziert elementweise zwei Arrays enthält mpf Zahlen auch funktioniert:

result * result 

Also ist dein wirkliches Problem, wie man eine mpmath Funktion in einem numply Array auswertet. Um das zu tun, würde ich np.frompyfunc verwenden (vor einiger Zeit war dies die einzige Option).

besseli_vec = np.frompyfunc(mp.besseli, 2, 1) 
besseli_vec(0, A) 
+0

Vielen Dank. Ich wollte gerade aufgeben und träge Loops verwenden! Sie erwähnen, das war die einzige Option vor einiger Zeit, was sind die anderen Optionen heutzutage? – Rapid

+3

@Rapid Eine schnelle Google-Suche scheint zu implizieren, dass es immer noch der einzige Weg ist. Das ist verständlich, da diese Option so einfach ist. – jorgeca

+0

Ich habe dasselbe Problem in einer anderen Einstellung und ich habe gerade meinen Beitrag mit dieser Seite verknüpft. Würde mich über jede Hilfe freuen, – Allan

3

Check out mpmath.arange:

import numpy as np 
import mpmath as mp 

np.array(mp.arange(600)) 
+0

Ich kann immer noch nicht tun dies 'A = np.array (arange (600))' gefolgt von 'besseli (0, A)' ohne es Fehler auf mich werfen? – Rapid