使用itertools.izip优化迭代

时间:2014-10-02 09:25:31

标签: python numpy sparse-matrix

我有一个迭代遍历矩阵的所有非零值的算法,如下所示:

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}}

你有什么建议?最快的方法是什么?

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