2014-02-16 3 views
0

Как я могу эффективно назначить строку lil_matrix? Я в настоящее время использую:Эффективно назначить строку lil_matrix

Q[mid, :] = new_Q 

где new_Q является результатом lil_matrix.getrow(x)

Я провел тест по использованию Q.getrow(i) vs. Q[i, :], и обнаружил, что бывший быть 20x быстрее.

Here's the lil_matrix documentation.

+0

В общем, я бы просто не использовал формат LIL, когда это было возможно. Конечно, вам нужно ориентироваться на ваш случай использования, но я ожидаю, что вы сможете использовать более быстрый формат. – perimosocordiae

+0

Какой формат использовать? Я только изменяю один столбец матрицы A за раз и изменяю один столбец матрицы B за раз. Я считал 'csr_matrix' и' csc_matrix', но я нашел эту заметку: «Обратите внимание, что присвоение CSR/CSC-матрице вообще плохой идеей. Любое изменение структуры разреженности этих форматов требует O (nnz) операций, которые в основном означает восстановление матрицы с нуля ». –

+0

Вы изменяете столбцы или строки? 'lil' хорош для строк, так как каждая строка представлена ​​простыми элементами из 2 списков. Для работы с определенными столбцами требуется доступ к элементам во многих вложенных списках. – hpaulj

ответ

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].

Показателем того, что может быть достигнуто, если вам нужно только установить одну строку, а также доступ rows и data непосредственно:

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 

Прямая модификация rows и data потребностей, которые будут испытаны тщательно.

Смежные вопросы