我有一个迭代遍历矩阵的所有非零值的算法,如下所示:
for row, col, val in itertools.izip(matrix.row, matrix.col, matrix.data):
dostuff(row, col, val)
我意识到这是在numpy
中迭代稀疏矩阵的最快方法,如Iterating through a scipy.sparse vector (or matrix)中所述。
我的问题是,我在每次评估时执行的功能都采用另一个向量,我们称之为vec
,如果vec[row]
等于0
则不执行任何操作,这在某些情况下是(row, col, val)
对于大多数行都是如此。
因此,我不想遍历vec[row] != 0
矩阵中的所有非零三元组import numpy as np
import scipy.sparse as sp
import itertools
N = 10000
matrix = sp.rand(N, N, density=0.0001, format='coo', dtype=None, random_state=None)
vec = np.zeroes(N)
s = 0
for row, col, val in itertools.izip(matrix.row, matrix.col, matrix.data):
if vec[row] != 0:
s += vec[row] * val # in reality, some other function is here
。
我目前所做的是
的简单而愚蠢的解决方案vec[row]!=0
如果vec
行不多,那么它比原始代码更快地工作和工作。但是,如果vec=np.ones(len(matrix.data))
的所有值都不为零,则代码运行缓慢,这是我不允许忽略的情况(例如,如果izip
。
因此,我需要for row, col, val in itertools.izip(matrix.row, matrix.col, matrix.data, lambda x: vec[x[0]] !> 0):
dostuff(row, col, val)
的某种扩展,这将允许我“有条件地”迭代它的输出,所以我会写类似
{{1}}
你有什么建议?最快的方法是什么?
答案 0 :(得分:2)
您可以在行,列和数据上使用Numpy的特殊索引:
which = vec[matrix.row] != 0
rows = matrix.row[which]
cols = matrix.col[which]
data = matrix.data[which]
for row, col, val in itertools.izip(rows, cols, data):
s += vec[row] * val