我试图在稀疏矩阵中操作一些数据。一旦创建了一个,如何在其中添加/更改/更新值?这看起来很基本,但我在稀疏矩阵类的文档中或在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
bsr的文档在此处bsr matrix,csr的文档在此处csr matrix。在转到bsr之前,了解csr可能是值得的。唯一的区别是bsr的条目本身是矩阵,而csr中的基本单位是标量。在
我不知道是否有超简单的方法来操作矩阵一旦它们被创建,但是这里有一些你想要做的例子
这是一种简单明了的语法,其中列出了数组
^{pr2}$data
中的矩阵中的所有数据,然后使用row
和col
指定这些数据的位置。请注意,这将使矩阵维数足够大,足以容纳最大行和列中的元素(在本例中为6x8矩阵)。您可以使用todense()
方法查看标准形式的矩阵。在但是,不能使用此模式动态操作矩阵。您可以做的是修改矩阵的本机scipy表示。这涉及3个属性,
indices
,indptr
,和data
。首先,我们可以检查已经创建的数组的这些属性的值。在data
和以前一样,是我们想要在矩阵中的一维值数组。不同之处在于,该数据的位置现在由indices
和{indices
相当简单。它只是每个数据项所在列的列表。它的大小和data
数组总是相同的。indptr
有点棘手。它让数据结构知道每个数据项在哪一行。引用文件从这个定义中我们可以看到
indptr
的大小总是矩阵中的行数+1。习惯它需要一点时间,但是处理每一行的值会给你一些直觉。请注意,在最后一个条目之前,所有条目都是零。这意味着行i=0-4
的列索引将存储在indices[0:0]
中,即空数组。这是因为这些行都是零。最后,在最后一行,i=5
我们得到indices[0:1]=7
,它告诉我们数据条目data[0:1]
在第5行第7列。在现在假设我们想在第2行第4列添加值10。我们首先将它放入
data
属性中接下来我们更新
indices
以指示第10列将在其中最后,我们通过修改
indptr
来指示它将位于哪一行将数据类型设置为}}时,数字的变化就会发生。还要注意,像这样的数组可以用来构造稀疏矩阵
indices
和{np.int32
,这一点很重要。可视化indptr
中的内容的一种方法是,当您从具有数据的行的i
移动到{如果能像您尝试的那样简单地索引到数组中,那就太好了,但是实现还没有实现。这至少足以让你开始。在
有几种稀疏矩阵格式。有些更适合索引。实现它的是
lil_matrix
。在每种格式的文档说明了它的优点和缺点。但它并没有一个清晰的列表,列出哪些操作定义了哪些操作。在
^{pr2}$dok_matrix
还实现索引。在coo_matrix
的底层数据结构很容易理解。它本质上是coo_matrix((data, (i, j)), [shape=(M, N)])
定义的参数。要创建相同的矩阵,可以使用:如果有更多的赋值,则构建更大的
data
、i
、j
列表(或1d数组),并在完成构建稀疏矩阵时。在相关问题 更多 >
编程相关推荐