AttributeError:找不到exp

时间:2017-12-02 12:01:47

标签: python numpy scipy networkx exponential

    n=sc.shape(A)[0]                   
    sim=sc.eye(n)           
    I=sc.eye(n)
    P= normalize(A, norm='l1', axis=0)          
    Q=P*(1-np.exp(-A))

A是由代码创建的邻接矩阵:

df=pd.read_csv('training.csv')
G=nx.from_pandas_dataframe(df,'node1','node2','weight')

A = nx.adjacency_matrix(G)

我得到的错误:

File "ROC_final.py", line 36, in ASCOSplus
   Q=P*(1-np.exp(-A))
 File "C:\Python27\lib\site-packages\scipy\sparse\base.py", line 647, in __getattr__
   raise AttributeError(attr + " not found")
AttributeError: exp not found

注意:我已经按照SO回答的建议尝试了解决方案A = A.astype(float)。

1 个答案:

答案 0 :(得分:4)

A是一个scipy稀疏矩阵。这样的矩阵没有实现exp函数,因为这会将所有0转换为1,从而产生一个密集的矩阵。

要使用稀疏矩阵进行计算,您可以将1 - np.exp(-A)写为-(np.exp(-A) - 1) = -np.expm1(-A)。也就是说,替换

Q=P*(1-np.exp(-A))

Q = -P*np.expm1(-A)

expm1(x)相当于exp(x) - 1。该函数将零映射到零,因此它是一个安全的"稀疏矩阵的逐元素函数。

scipy稀疏矩阵有一个expm1()方法(np.expm1最终调用),所以你也可以将该行写为

Q = P*(-A).expm1()