你如何使用稀疏矩阵编辑稀疏矩阵?

2024-04-19 20:49:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在稀疏矩阵中操作一些数据。一旦创建了一个,如何在其中添加/更改/更新值?这看起来很基本,但我在稀疏矩阵类的文档中或在web上找不到。我想我错过了一些重要的东西。在

这是我失败的尝试,我这样做的方式,我正常数组。在

>>> from scipy.sparse import bsr_matrix
>>> A = bsr_matrix((10,10))
>>> A[5][7] = 6

Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    A[5][7] = 6
  File "C:\Python27\lib\site-packages\scipy\sparse\bsr.py", line 296, in __getitem__
    raise NotImplementedError
NotImplementedError

Tags: 数据infrom文档web方式line矩阵
2条回答

bsr的文档在此处bsr matrix,csr的文档在此处csr matrix。在转到bsr之前,了解csr可能是值得的。唯一的区别是bsr的条目本身是矩阵,而csr中的基本单位是标量。在

我不知道是否有超简单的方法来操作矩阵一旦它们被创建,但是这里有一些你想要做的例子

import numpy as np
from scipy.sparse import bsr_matrix, csr_matrix

row = np.array( [5] )
col = np.array( [7] )
data = np.array( [6] )
A = csr_matrix( (data,(row,col)) )

这是一种简单明了的语法,其中列出了数组data中的矩阵中的所有数据,然后使用rowcol指定这些数据的位置。请注意,这将使矩阵维数足够大,足以容纳最大行和列中的元素(在本例中为6x8矩阵)。您可以使用todense()方法查看标准形式的矩阵。在

^{pr2}$

但是,不能使用此模式动态操作矩阵。您可以做的是修改矩阵的本机scipy表示。这涉及3个属性,indicesindptr,和data。首先,我们可以检查已经创建的数组的这些属性的值。在

>>> print A.data
array([6])

>>> print A.indices
array([7], dtype=int32)

>>> print A.indptr
array([0, 0, 0, 0, 0, 0, 1], dtype=int32)

data和以前一样,是我们想要在矩阵中的一维值数组。不同之处在于,该数据的位置现在由indices和{}指定,而不是{}和{}。indices相当简单。它只是每个数据项所在列的列表。它的大小和data数组总是相同的。indptr有点棘手。它让数据结构知道每个数据项在哪一行。引用文件

the column indices for row i are stored in indices[indptr[i]:indptr[i+1]]

从这个定义中我们可以看到indptr的大小总是矩阵中的行数+1。习惯它需要一点时间,但是处理每一行的值会给你一些直觉。请注意,在最后一个条目之前,所有条目都是零。这意味着行i=0-4的列索引将存储在indices[0:0]中,即空数组。这是因为这些行都是零。最后,在最后一行,i=5我们得到indices[0:1]=7,它告诉我们数据条目data[0:1]在第5行第7列。在

现在假设我们想在第2行第4列添加值10。我们首先将它放入data属性中

A.data = np.array( [10,6] )   

接下来我们更新indices以指示第10列将在其中

A.indices = np.array( [4,7], dtype=np.int32 )

最后,我们通过修改indptr来指示它将位于哪一行

A.indptr = np.array( [0,0,0,1,1,1,2], dtype=np.int32 )

将数据类型设置为indices和{}np.int32,这一点很重要。可视化indptr中的内容的一种方法是,当您从具有数据的行的i移动到{}时,数字的变化就会发生。还要注意,像这样的数组可以用来构造稀疏矩阵

B = csr_matrix( (data,indices,indptr) )

如果能像您尝试的那样简单地索引到数组中,那就太好了,但是实现还没有实现。这至少足以让你开始。在

有几种稀疏矩阵格式。有些更适合索引。实现它的是lil_matrix。在

Al = A.tolil()
Al[5,7] = 6  # the normal 2d matrix indexing notation
print Al
print Al.A # aka Al.todense()
A1 = Al.tobsr()  # if it must be in bsr format

每种格式的文档说明了它的优点和缺点。但它并没有一个清晰的列表,列出哪些操作定义了哪些操作。在

^{pr2}$

dok_matrix还实现索引。在

coo_matrix的底层数据结构很容易理解。它本质上是coo_matrix((data, (i, j)), [shape=(M, N)])定义的参数。要创建相同的矩阵,可以使用:

sparse.coo_matrix(([6],([5],[7])), shape=(10,10))

如果有更多的赋值,则构建更大的dataij列表(或1d数组),并在完成构建稀疏矩阵时。在

相关问题 更多 >