尝试直接设置稀疏data
的{{1}}属性时,遇到非常意外的行为。有人可以通过以下简单示例解释发生了什么吗?
我的特定用例是我想设置行模2;即在密集矩阵中说话我只想做lil_matrix
。
matrix[0] %= 2
答案 0 :(得分:1)
我不太确定matrix[0]
是什么类型的对象,但我认为您的意思是删除matrix
上的索引并仅将其保留在data
上:
num_entries = len(matrix.data[0])
matrix.data[0] = [2]*num_entries
答案 1 :(得分:0)
@vlsd发现了这个错误,但是我想补充一下这个错误。
我发布的代码的问题是我(全程)分配给matrix[0].data
。问题是matrix[0]
与密集阵列的工作方式不同;它不是简单地指向同一个对象,而是制作一个新对象(我想)。因此,为这个新对象分配数据很好,但它不会影响matrix
。这就是问题所在。
所以下面的代码工作正常:
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 从列表中弹出通常是一个坏主意,因为这可能会破坏稀疏矩阵的完整性。但这只是为了演示。它现在有道理。