Добавление массива numy в scipy.sparse.dok_matrix - PullRequest
4 голосов
/ 20 апреля 2010

У меня есть scipy.sparse.dok_matrix (размеры m x n), я хочу добавить плоский массив numpy с длиной m.

for col in xrange(n):
    dense_array = ...
    dok_matrix[:,col] = dense_array

Однако этот код вызывает исключение в dok_matrix.__setitem__, когда пытается удалить несуществующий ключ (del self[(i,j)]).

Итак, пока я делаю это нелегким способом:

for col in xrange(n):
    dense_array = ...
    for row in dense_array.nonzero():
        dok_matrix[row, col] = dense_array[row]

Это чувствует очень неэффективным. Итак, каков наиболее эффективный способ сделать это?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 20 апреля 2010

Я удивлен, что ваш не элегантный способ не имеет тех же проблем, что и путь среза. Это похоже на ошибку при взгляде на код Scipy. Когда вы пытаетесь установить определенную строку и столбец в dok_matrix на ноль, когда он уже равен нулю, возникает ошибка, потому что он пытается удалить значение в этой строке и столбце, не проверяя, существует ли он.

В ответ на ваш вопрос то, что вы делаете неэлегентным способом, - это именно то, что метод __setitem__ делает в настоящее время с вашим элегантным методом (после нескольких проверок экземпляра, а что нет). Если вы хотите использовать элегантный способ, вы можете исправить ошибку, о которой я упоминал, в вашем собственном пакете Scipy, открыв dok.py в Lib/site-packages/scipy/sparse/ и изменив строку 222 с

if value==0:

до

if value==0 and self.has_key((i,j)):

Тогда вы можете использовать элегантный способ, и он должен работать просто отлично. Я отправил исправление ошибки, но это уже исправлено в следующей версии, и именно так оно и было исправлено.

1 голос
/ 04 сентября 2010

Я думаю, что эта ошибка была исправлена ​​в Scipy 0.8.0

...