2024-06-10 03:35:47 发布
网友
访问scipy.sparse矩阵A的行row或列col中所有非零值的最快或最简单的方法是什么?
scipy.sparse
A
row
col
用另一种格式(比如COO)来做会更有效吗?
COO
现在,我使用以下命令:
A[row, A[row, :].nonzero()[1]]
或者
A[A[:, col].nonzero()[0], col]
对于这样的问题,了解不同格式的底层数据结构是值得的:
In [672]: A=sparse.csr_matrix(np.arange(24).reshape(4,6)) In [673]: A.data Out[673]: array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23], dtype=int32) In [674]: A.indices Out[674]: array([1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5], dtype=int32) In [675]: A.indptr Out[675]: array([ 0, 5, 11, 17, 23], dtype=int32)
行的data值是A.data中的一个切片,但是识别该切片需要对A.indptr有一些了解(请参见下文)
data
A.data
A.indptr
对于coo。
coo
In [676]: Ac=A.tocoo() In [677]: Ac.data Out[677]: array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23], dtype=int32) In [678]: Ac.row Out[678]: array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3], dtype=int32) In [679]: Ac.col Out[679]: array([1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5], dtype=int32)
请注意,A.nonzeros()转换为coo,并返回row和col属性(或多或少-查看其代码)。
A.nonzeros()
对于lil格式,数据按行存储在列表中:
lil
In [680]: Al=A.tolil() In [681]: Al.data Out[681]: array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10, 11], [12, 13, 14, 15, 16, 17], [18, 19, 20, 21, 22, 23]], dtype=object) In [682]: Al.rows Out[682]: array([[1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]], dtype=object)
一、二、二、三
选择一行A是可行的,尽管根据我的经验,这有点慢,部分原因是它必须创建一个新的csr矩阵。而且你的表情似乎比需要的要多。
csr
看我的第一行有一个0元素(其他元素太密集):
In [691]: A[0, A[0,:].nonzero()[1]].A Out[691]: array([[1, 2, 3, 4, 5]], dtype=int32)
整行表示为密集数组:
In [692]: A[0,:].A Out[692]: array([[0, 1, 2, 3, 4, 5]], dtype=int32)
但该行的data属性与您的选择相同
In [693]: A[0,:].data Out[693]: array([1, 2, 3, 4, 5], dtype=int32)
使用lil格式
In [694]: Al.data[0] Out[694]: [1, 2, 3, 4, 5]
A[0,:].tocoo()没有添加任何内容。
A[0,:].tocoo()
在挑选列时,直接访问csr和lil的属性不是很好。因为csc更好,或者lil的转座。
csc
在indptr的帮助下,直接访问csrdata将是:
indptr
In [697]: i=0; A.data[A.indptr[i]:A.indptr[i+1]] Out[697]: array([1, 2, 3, 4, 5], dtype=int32)
使用csr格式的计算通常会像这样遍历indptr,获得每行的值-但它们是在编译的代码中完成的。
最近的一个相关主题,逐行查找非零元素的乘积: Multiplying column elements of sparse Matrix
在那里我发现reduceat使用indptr非常快。
reduceat
处理稀疏矩阵的另一个工具是乘法
In [708]: (sparse.csr_matrix(np.array([1,0,0,0])[None,:])*A) Out[708]: <1x6 sparse matrix of type '<class 'numpy.int32'>' with 5 stored elements in Compressed Sparse Row format>
csr实际上用这种乘法做sum。如果我的内存是正确的,它实际上是这样执行A[0,:]
sum
A[0,:]
Sparse matrix slicing using list of int
对于这样的问题,了解不同格式的底层数据结构是值得的:
行的
data
值是A.data
中的一个切片,但是识别该切片需要对A.indptr
有一些了解(请参见下文)对于
coo
。请注意,
A.nonzeros()
转换为coo
,并返回row
和col
属性(或多或少-查看其代码)。对于
lil
格式,数据按行存储在列表中:一、二、二、三
选择一行
A
是可行的,尽管根据我的经验,这有点慢,部分原因是它必须创建一个新的csr
矩阵。而且你的表情似乎比需要的要多。看我的第一行有一个0元素(其他元素太密集):
整行表示为密集数组:
但该行的
data
属性与您的选择相同使用
lil
格式A[0,:].tocoo()
没有添加任何内容。在挑选列时,直接访问
csr
和lil
的属性不是很好。因为csc
更好,或者lil
的转座。在
indptr
的帮助下,直接访问csr
data
将是:使用
csr
格式的计算通常会像这样遍历indptr
,获得每行的值-但它们是在编译的代码中完成的。最近的一个相关主题,逐行查找非零元素的乘积: Multiplying column elements of sparse Matrix
在那里我发现
reduceat
使用indptr
非常快。处理稀疏矩阵的另一个工具是乘法
csr
实际上用这种乘法做sum
。如果我的内存是正确的,它实际上是这样执行A[0,:]
Sparse matrix slicing using list of int
相关问题 更多 >
编程相关推荐