为了创建scipy sparse matrix,我有一个数组或行和列索引 I
和 J
以及数据数组 V
. 我使用它们在COO format中构造一个矩阵,然后将其转换为CSR,
matrix = sparse.coo_matrix((V, (I, J)), shape=(n, n))
matrix = matrix.tocsr()
我有一组行索引,对角线上唯一的条目应该是 1.0
. 到目前为止,我通过 I
,查找需要擦除的所有索引,并执行以下操作:
def find(lst, a):
# From <http://stackoverflow.com/a/16685428/353337>
return [i for i, x in enumerate(lst) if x in a]
# wipe_rows = [1, 55, 32, ...] # something something
indices = find(I, wipe_rows) # takes too long
I = numpy.delete(I, indices).tolist()
J = numpy.delete(J, indices).tolist()
V = numpy.delete(V, indices).tolist()
# Add entry 1.0 to the diagonal for each wipe row
I.extend(wipe_rows)
J.extend(wipe_rows)
V.extend(numpy.ones(len(wipe_rows)))
# construct matrix via coo
这没关系,但 find
往往需要一段时间 .
关于如何提高速度的任何提示? (也许以COO或CSR格式擦除行是一个更好的主意 . )
2 回答
如果您打算一次清除多行,请执行此操作
是迄今为止最快的方法 . 它并没有真正删除线条,而是将所有条目设置为零,然后用对角线填充 .
如果实际要删除条目,则必须进行一些数组操作 . 这可能是非常昂贵的,但如果速度没有问题:这
通过对角线上的条目
1.0
替换矩阵matrix
的给定行i
.np.in1d
应该是找到indices
的更快捷方式:像这样直接操纵
coo
输入通常是一种好方法 . 但另一个是利用csr
数学能力 . 您应该能够构造一个对齐矩阵,将正确的行归零,然后将其重新添加 .这就是我的想法:
使用
lil
格式执行此操作看起来很简单:这是你用
csr
格式做的事情,但是用适当的[1]和[i]列表替换每个行列表很容易 . 但转换时间(tolil
等)可能会影响运行时间 .