微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将稀疏方阵分割成块

如何解决将稀疏方阵分割成块

我有一个带状稀疏方阵 A,类型为 <class 'scipy.sparse.csr.csr_matrix'>,大小 = 400 x 400。我想将其拆分为大小为 200 x 200 的块方阵。比如第一个

block1 = A[0:200,0:200]
block2 = A[100:300,100:300]
block3 = A[200:400,200:400]

关于切片的相同信息存储在元组列表中。

 [(0,200),(100,300),(200,400)]

关于如何拆分备用方阵的建议将非常有帮助。

解决方法

可以先转换成正则数组再拆分:

INSERT INTO tableB(ID)
SELECT ID
FROM tableA
WHERE VALUE = 0

如果你愿意,你可以将每个块转换回压缩矩阵:

from scipy.sparse import csr_matrix
import numpy as np

row = np.arange(400)[::2]
col = np.arange(400)[1::2]
data = np.random.randint(1,10,(200))
compressed_matrix = csr_matrix((data,(row,col)),shape=(400,400))

# Convert to a regular array
m = compressed_matrix.toarray()
# Split the matrix
sl = [(0,200),(100,300),(200,400)]
blocks = [m[i,i] for i in map(lambda x: slice(*x),sl)]

代码说明

块的创建基于 list comprehension 和基本切片。 每个输入元组被转换为一个slice对象,只创建一系列行和列索引,对应于要选择的元素的索引;在这个答案中,这足以选择请求的块平方矩阵。使用扩展索引语法时会生成切片对象:明确地说,blocks_csr = list(map(csr_matrix,blocks)) 将创建一个等效于 a[start:stop:step] 的切片对象。在我们的例子中,它们用于根据我们要提取的矩阵动态更改要选择的索引。所以,如果你考虑第一个块,slice(start,stop,step) 等价于 m[i,i]

切片对象是basic indexing的一种形式,所以创建的是原始数组的view,而不是副本(这意味着如果你修改视图,原始数组也会被修改:您可以使用 numpy 数组的 copy 方法轻松创建原始数据的副本)。

map 对象用于从输入元组生成切片对象; m[0:200,0:200] 将作为其第一个参数提供的函数应用于其第二个参数的所有元素。 map 用于创建匿名函数,即没有名称定义的函数。匿名函数对于完成您不想在标准函数中编码的特定任务非常有用,因为您不会重用它们或者您只需要很短的时间,就像在此代码的示例中一样。它们使代码更紧凑,而不是定义相应的函数。

lambda 称为 unpacking,即您从元组中提取、解包元素。假设你有一个函数 *x 和一个元组 f,那么 a = (1,2,3) 就等价于 f(*a)(如你所见,你可以把解包看作是去掉一层括号).

所以,回顾一下代码:

f(1,3)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。