Python 稀疏lil_矩阵无法分配数据

Python 稀疏lil_矩阵无法分配数据,python,scipy,sparse-matrix,Python,Scipy,Sparse Matrix,当试图直接设置稀疏lil_矩阵的data属性时,我遇到了非常意外的行为。有人能解释一下下面这个简单的例子中发生了什么吗 我的特殊用例是我想将行设置为模2;i、 在密集矩阵中,我只想做矩阵[0]=2 from scipy import sparse import numpy as np np.random.seed(0) matrix = sparse.rand(10**3,10**3).tolil() num_entries = len(matrix[0].data[0]) print num

当试图直接设置稀疏
lil_矩阵
data
属性时,我遇到了非常意外的行为。有人能解释一下下面这个简单的例子中发生了什么吗

我的特殊用例是我想将行设置为模2;i、 在密集矩阵中,我只想做
矩阵[0]=2

from scipy import sparse
import numpy as np
np.random.seed(0)

matrix = sparse.rand(10**3,10**3).tolil()
num_entries = len(matrix[0].data[0])
print num_entries
# 9

# this throws no errors...
matrix[0].data[0] = [2]*num_entries
# but does nothing!

assert (np.array(matrix[0].data) == 2).all() # FAILS

# in fact nothing can be done to alter .data directly...
matrix[0].data[0].pop() # returns the last float from the row
# but does not actually pop it from the row!
assert (len(matrix[0].data[0]) == num_entries-1) # FAILS

我不太清楚
矩阵[0]
是什么类型的对象,但我认为您的意思是删除
矩阵
上的索引,只保留
数据

num_entries = len(matrix.data[0])
matrix.data[0] = [2]*num_entries

@vlsd发现了这个错误,但我添加这个来说明更多

我发布的代码的问题是我(始终)分配给
矩阵[0]。数据。问题是
矩阵[0]
的工作原理与密集阵列不同;它不是简单地指向同一个对象,而是创建一个新对象(我认为)。因此,将数据分配给这个新对象是可以的,但它不会影响矩阵。这就是问题所在

因此,以下代码可以正常工作:

matrix.data[0] = [2]*num_entries
assert (np.array(matrix.data[0]) == 2).all() # passes
matrix.data[0].pop()
assert (len(matrix.data[0]) == num_entries-1) # passes

NB从列表中弹出通常是个坏主意,因为这可能会破坏稀疏矩阵的完整性。但这只是为了演示。现在有了意义。

这解决了问题,谢谢!我认为原因是
矩阵[0]
实际上是在复制第一行并将其放入新矩阵中。因此,当我设置数据时,我没有设置矩阵。
num\u条目的值是多少?我猜是
0
matrix.data
是一个列表列表,
matrix.data[0]
是第一个列表。它很可能是空的。我在上面的代码中添加了它——但是num_条目是9。matrix.data实际上是一个列表python对象的numpy.array。因此
matrix[i]。data[0]==matrix.data[i]
对于所有
i
都是正确的,但与
is
操作符相比,情况并非如此。