簡體   English   中英

稀疏lil_matrix無法分配數據

[英]sparse lil_matrix cannot assign data

嘗試直接設置稀疏lil_matrixdata屬性時,遇到非常意外的行為。 有人可以在下面的簡單示例中說明發生了什么嗎?

我的特定用例是我想以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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM