np.exp
ist Element durch exponentielles Element. expm
ist eine Matrix exponentiell, eine sehr unterschiedliche Berechnung.
In [539]: A = np.array([[0,2,1],[2,0,3],[1,3,0]])
In [541]: np.exp(A)
Out[541]:
array([[ 1. , 7.3890561 , 2.71828183],
[ 7.3890561 , 1. , 20.08553692],
[ 2.71828183, 20.08553692, 1. ]])
In [542]: np.exp?
In [543]: np.exp(2)
Out[543]: 7.3890560989306504
https://en.wikipedia.org/wiki/Matrix_exponential#Computing_the_matrix_exponential '
In [545]: from scipy.sparse import linalg
In [547]: linalg.expm(A)
Out[547]:
array([[ 13.45868182, 18.62459092, 16.65146966],
[ 18.62459092, 26.50610262, 23.85956737],
[ 16.65146966, 23.85956737, 21.61331982]])
Ich weiß nicht, ob es eine Funktion ist die spärliche exponentiell zu tun, aber die Stücke mit ausgewertet werden:
In [565]: sA = sparse.csc_matrix(A)
In [566]: np.exp(sA.data)
Out[566]:
array([ 7.3890561 , 2.71828183, 7.3890561 , 20.08553692,
2.71828183, 20.08553692])
In [567]: np.exp(0)
Out[567]: 1.0
Da die exp(0)
ist 1, das Ergebnis, selbst mit einer dünnen Matrix, ist dicht. Es wäre also genauso einfach (und wahrscheinlich schneller), die dünn besetzte Matrix in dicht zu konvertieren und die Dichteberechnung durchzuführen.
Als @Desire kommentiert, gibt es eine np.expm1
Funktion. Und die Sparse Matrix hat
In [574]: sA.expm1().A
Out[574]:
array([[ 0. , 6.3890561 , 1.71828183],
[ 6.3890561 , 0. , 19.08553692],
[ 1.71828183, 19.08553692, 0. ]])
In [575]: sA.expm1().A+1
Out[575]:
array([[ 1. , 7.3890561 , 2.71828183],
[ 7.3890561 , 1. , 20.08553692],
[ 2.71828183, 20.08553692, 1. ]])
Diese Methode gilt np.expm1
seine data
, und gibt eine Kopie mit dem gleichen sparsity. np.expm1(sA)
funktioniert auch.
sA.expm1()+1
funktioniert nicht. Sie müssen zuerst die Matrix dicht machen.
Wie man elementweise Exponential einer dünnen Matrix dann tut? –
Die Exponentialfunktion wird dicht sein, da 'exp (0)' 1 ist. Daher hat eine spärliche Berechnung, obwohl sie möglich ist, wahrscheinlich nur wenige Vorteile. Sieh dir meine Änderungen an. – hpaulj
Kann np.exp auch mit großen Matrizen umgehen? Auch muss ich Multiplikation durchführen, nachdem ich die Multiplikation erhalten habe, also wird es nicht ineffizient sein, zuerst das Sparse in ein dichtes zu konvertieren, dann wieder in ein spärliches für die Multiplikation? –