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 不起作用。您必须先使矩阵密集。