首先,我们将如何处理密集阵列?
mat-vec.A # taking advantage of broadcasting
mat-vec.A[:,[0]*3] # explicit broadcasting
mat-vec[:,[0,0,0]] # that also works with csr matrix
在https://codereview.stackexchange.com/questions/32664/numpy-scipy- optimization/33566中, 我们发现as_strided
在mat.indptr
向量上使用是逐步浏览稀疏矩阵行的最有效方法。(本x.rows
,x.cols
一个lil_matrix
是几乎一样好。getrow
很慢)。该功能实现了迭代。
def sum(X,v):
rows, cols = X.shape
row_start_stop = as_strided(X.indptr, shape=(rows, 2),
strides=2*X.indptr.strides)
for row, (start, stop) in enumerate(row_start_stop):
data = X.data[start:stop]
data -= v[row]
sum(mat, vec.A)
print mat.A
我vec.A
为了简单起见使用。如果我们保持vec
稀疏状态,则必须在处添加一个非零值的测试row
。同样,这种类型的迭代只会修改的非零元素mat
。0's
不变。
我怀疑时间优势将在很大程度上取决于矩阵和向量的稀疏性。如果vec
有很多零,则进行迭代是有意义的,仅修改mat
其中vec
非零的那些行。但是vec
像这样的例子几乎是密集的,可能很难被击败mat- vec.A
。