首先,我们将如何处理密集阵列?
mat-vec.A # taking advantage of broadcastingmat-vec.A[:,[0]*3] # explicit broadcastingmat-vec[:,[0,0,0]] # that also works with csr matrix
在https://prereview.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。



