【发布时间】:2016-08-31 13:48:44
【问题描述】:
对于一个项目,我需要一个高效的 python 函数来解决以下任务:
给定一个非常大的长稀疏向量列表 X(=> 大稀疏矩阵)和另一个包含单个向量 y 的矩阵 Y,我想要一个“距离”列表,y 对 X 的每个元素都有。特此“距离”是这样定义的:
比较两个向量的每个元素,总是取较低的一个并将它们相加。
例子:
X = [[0,0,2],
[1,0,0],
[3,1,0]]
Y = [[1,0,2]]
函数应该返回 dist = [2,1,1]
在我的项目中,X 和 Y 都包含很多零,并作为以下实例出现:
<class 'scipy.sparse.csr.csr_matrix'>
到目前为止一切顺利,我设法编写了一个解决此任务的函数,但速度非常慢且效率极低。我需要一些关于如何高效处理/迭代稀疏矩阵的技巧。 这是我的功能:
def get_distances(X, Y):
Ret=[]
rows, cols = X.shape
for i in range(0,rows):
dist = 0
sample = X.getrow(i).todense()
test = Y.getrow(0).todense()
rows_s, cols_s = sample.shape
rows_t, cols_t = test.shape
for s,t in zip(range(0, cols_s), range(0, cols_t)):
dist += min(sample[0,s], test[0,t])
X_ret.append([dist])
return ret
为了进行操作,我将稀疏矩阵转换为密集矩阵,这当然很糟糕,但我不知道如何做得更好。你知道如何改进我的代码并使功能更快吗?
非常感谢!
【问题讨论】:
-
您不仅将稀疏矩阵转换为稠密矩阵,而且还在密集矩阵上进行迭代。你能退后一步,用密集数组解决这个问题,使用数组操作吗?一旦这样做了,将动作转换为稀疏矩阵应该会更容易。
-
当我运行你的代码时,更正了
ret,我得到[[2], [0], [0]];你的函数也根本不使用Y。 -
对不起,我在变量“test”的声明中打错了。我改正了
标签: python performance scipy sparse-matrix