我有一个CSR矩阵,我希望能够检索列索引和值。
下面是我创建矩阵的方法(使用scipy.sparse中的csr_matrix):
indptr = np.empty(nbr_of_rows + 1) # nbr_of_rows = 134,465
indptr[0] = 0
for i in range(1, len(indptr)):
indptr[i] = indptr[i-1] + len(data[i-1]) # type(data) = list ; len(data) = 134,465 ; type(data[0]) = numpy.darray (each subarray has a different length)
data = np.concatenate(data).ravel() # now I have type(data) = numpy.darray ; len(data) = 2,821,574
ind = np.concatenante(ind).ravel # same than above
X = csr_matrix((data, ind, indptr), shape=(nbr_of_rows, nbr_of_columns)) # nbr_of_columns = 3,991
print(f"The matrix has a shape of {X.shape} and a sparsity of {(1 - (X.nnz / (X.shape[0] * X.shape[1]))): .2%}.")
# OUT: The matrix has a shape of (134465, 3991) and a sparsity of 99.47%.
到目前为止一切顺利(至少我是这么认为的)。但是现在,即使我设法检索了列索引,我也不能成功地检索值:
np.alltrue(ind == X.nonzero()[1]) # True
np.alltrue(data == X[X.nonzero()]) # False
当我看得更深时,我发现我得到了 * 几乎 * 所有的值(只有少量的错误):
len(data) == len(X[X.nonzero()].tolist()[0]) # True
len(np.argwhere((data==X[X.nonzero()]) == False)) # 2184
因此,在总共2,821,574个值中,我“只”得到了2,184个错误值。
有人能帮我从我的CSR矩阵中获得所有正确的值吗?
2条答案
按热度按时间zf9nrax11#
根据您存储在矩阵中的值的类型(
numpy.float64
或numpy.int64
),下面的帖子可能会回答您的问题:https://github.com/scipy/scipy/issues/13329#issuecomment-753541268特别是,注解“* 显然,当数据是numpy数组而不是列表时,我没有得到错误。*”表明将
data
作为numpy.array
而不是list
可以解决您的问题。希望这至少能让你走上正轨。
esbemjvw2#
如果没有
data
,我就无法复制您的问题,而且即使使用这么大的数组,我也可能不想这样做。但是我将试着说明当用这种方法构造一个矩阵时,我期望发生什么。从另一个问题开始,我在Ipython会话中有一个小矩阵:
nonzero
返回coo
索引,行,列csr属性包括:
现在,让我们使用
Mx
的属性创建一个新的矩阵。假设您正确地构建了indptr
、indices
和data
,这应该可以模仿您所做的操作:data
两个矩阵之间的匹配:data
的id
不匹配,但它们的基匹配。请参阅我最近的回答,了解为什么这是相关的https://stackoverflow.com/a/74543855/901925
这意味着对
newA
的更改将出现在Mx
中:富勒试验
让我们对您的代码进行一个小规模测试:
而稀疏矩阵:
data
匹配项:且实际上是
view
:哎呀
我在指定
X
形状时出错: