【发布时间】:2014-08-29 04:11:28
【问题描述】:
当尝试直接设置稀疏lil_matrix 的data 属性时,我遇到了非常意外的行为。有人可以解释以下简单示例中发生了什么吗?
我的特殊用例是我想设置行模 2;即在密集矩阵中我只想做matrix[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
【问题讨论】:
-
num_entries的值是多少?我猜0。matrix.data是列表列表,matrix.data[0]是其中的第一个。它很可能是空的。 -
我在上面的代码中添加了它——但是 num_entries 是 9。matrix.data 实际上是一个 numpy.array 的 Python 对象,它们是列表。
-
所以
matrix[i].data[0] == matrix.data[i]对所有i都是正确的,但与is运算符相比,情况并非如此。
标签: python scipy sparse-matrix