np.exp
是由元件指數元件。 expm
是一個矩陣指數,一個非常不同的計算。
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]])
我不知道是否有做稀疏指數函數,但片可以進行評估:
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
由於exp(0)
是1,即使是稀疏矩陣,結果也很密集。因此,將稀疏矩陣轉換爲密集並進行密集計算就會很容易(也可能更快)。
由於@Desire評論,有一個np.expm1
函數。而稀疏矩陣具有
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. ]])
此方法適用np.expm1
其data
,並返回相同的稀疏副本。 np.expm1(sA)
也有效。
sA.expm1()+1
不起作用。你必須首先使矩陣密集。
如何做一個稀疏矩陣元素明智的指數呢? –
因爲'exp(0)'是1,所以指數將是密集的。所以儘可能稀疏計算可能沒有什麼優勢。查看我的編輯。 – hpaulj
np.exp是否可以處理大型矩陣?我還需要在乘法之後進行乘法運算,因此,如果先將稀疏運算轉換爲稠密運算並再次稀疏乘法運算,那麼效率會不高? –