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
操作符相比,情况并非如此。