[英]sparse lil_matrix cannot assign data
嘗試直接設置稀疏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
我不太確定是哪種對象matrix[0]
,但是我認為您的意思是刪除對matrix
的索引,僅將其保留在data
:
num_entries = len(matrix.data[0])
matrix.data[0] = [2]*num_entries
@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
注意:從列表中彈出通常不是一個好主意,因為這可能會破壞稀疏矩陣的完整性。 但這只是為了演示。 現在這很有意義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.