有效地为lil_matrix分配行

时间:2014-02-16 22:08:33

标签: python scipy sparse-matrix

如何有效地将行分配给lil_matrix?我目前正在使用:

Q[mid, :] = new_Q

其中new_Qlil_matrix.getrow(x)

的结果

我使用Q.getrow(i)Q[i, :]进行了测试,发现前者的速度提高了20倍。

Here's the lil_matrix documentation.

1 个答案:

答案 0 :(得分:0)

对小lil进行这些时间测试(密集,但我认为不重要),建议x[i,:]不是问题设置。是的,出于某种原因,用于获取行时速度很慢。

In [108]: x=sparse.lil_matrix(np.arange(120).reshape(24,5))

In [109]: timeit x[10,:]=10
1000 loops, best of 3: 235 us per loop

In [110]: timeit y=x.getrowview(10);y[:]=10
1000 loops, best of 3: 291 us per loop

In [111]: timeit x[10,:]
1000 loops, best of 3: 658 us per loop

In [112]: timeit x.getrowview(10)
10000 loops, best of 3: 51.4 us per loop

getrowview的来源具有指导意义,展示了如何处理此矩阵的基础数据结构。

def getrowview(self, i):
    """Returns a view of the 'i'th row (without copying).
    """
    new = lil_matrix((1, self.shape[1]), dtype=self.dtype)
    new.rows[0] = self.rows[i]
    new.data[0] = self.data[i]
    return new

我认为x[10,:]使用x.__getitem__x.__setitem__。这两个函数都比这个getrowview更复杂。我猜x.__getitem__很慢,因为它也在列上建立索引(参见。x._get1)。 x[10,:]的时间与x[10,0:5]一样长。

如果您只需要设置一行,并直接访问rowsdata,则表示可以完成的工作:

In [133]: timeit x.rows[10]=range(5);x.data[10]=[10]*5
1000000 loops, best of 3: 1.36 us per loop

这远非一般,但它可以让您了解在特殊情况下您可以做些什么。


更多时间:

In [156]: timeit x[10,:]=x.getrow(12)[:,:]
1000 loops, best of 3: 940 us per loop

In [157]: timeit x[10,:]=x.getrow(12)
1000 loops, best of 3: 259 us per loop

额外的[:,:]很慢。 getrow已经返回副本,因此可能不需要。

In [160]: timeit b=x.getrowview(10);b=x.getrow(12)
10000 loops, best of 3: 104 us per loop

In [169]: timeit x.rows[10],x.data[10] = x.rows[12][:],x.data[12][:]
1000000 loops, best of 3: 1.25 us per loop

需要仔细测试rowsdata的直接修改。

相关问题