Я удивлен, что ваш не элегантный способ не имеет тех же проблем, что и путь среза. Это похоже на ошибку при взгляде на код 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)):
Тогда вы можете использовать элегантный способ, и он должен работать просто отлично. Я отправил исправление ошибки, но это уже исправлено в следующей версии, и именно так оно и было исправлено.