scipy.sparse.linalg在 Python 中的包中,调用expm_multiply(X, v)允许您以expm(X)@v非常有效的方式计算向量。X此外,当是稀疏数据类型(如csr_matrixor csc_matrix)时,此函数效果最佳。但是,我发现当是稀疏数据类型时,与当是 a 时相比,此函数的工作速度较慢(参见下面的示例)。vvnumpy.ndarray
这导致了几个问题。第一:为什么不是稀疏数据类型expm_multiply(X, v)时最有效v,即使X应该是稀疏的?第二:我是否应该将此视为一般属性 - 如果效率很重要,我通常不应该将向量转换为稀疏数据类型?
一些显示发生了什么的示例代码如下:
import numpy as np
from numpy.random import uniform
from time import process_time
from scipy import linalg
from scipy import sparse
from scipy.sparse import linalg
dim = pow(2, 12)
#create vector where most elements are 0
v = np.zeros(dim)
for i in range(len(v)):
if i%50 == 0:
v[i] = uniform(-1, 1)
#create matrix where most elements are 0
X = np.zeros([dim,dim])
for i in range(len(v)):
for j in range(len(v)):
if i%50 ==0 and (j+1)%50 == 0:
X[i][j] = uniform(-1, 1)
Xsparse = sparse.csr_matrix(X)
vsparse = sparse.csr_matrix(v).T
#compare sparse vs unsparse exp(X)v calculation
start = process_time()
A = sparse.linalg.expm_multiply(Xsparse, v)
print(process_time() - start)
start = process_time()
B = sparse.linalg.expm_multiply(Xsparse, vsparse)
print(process_time() - start)
这将产生如下输出:
0.0019309999999990168
0.01379999999999626
因此 usingvsparse大约比 using 长一个数量级v。