[使用Python,NumPy,SciPy使用矩阵乘法对矩阵进行有效切片
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[使用Python,NumPy,SciPy使用矩阵乘法对矩阵进行有效切片相关的知识,希望对你有一定的参考价值。
我想将2d scipy.sparse.csr.csr_matrix
(我们称其为A
)重塑为2d numpy.ndarray
(我们称其为B
)。
A
可能是
>shape(A)
(90, 10)
然后B
应该是
>shape(B)
(9,10)
其中A
的每10行将以新的新值(即此窗口和列的最大值)进行整形。列运算符无法处理这种不可散列的稀疏矩阵。如何使用矩阵乘法获得此B
?
答案
使用矩阵乘法,您可以对切片进行有效的切片,以在正确的位置创建一个“切片”矩阵。切片的矩阵将与“切片器”具有相同的type
,因此您可以有效地控制输出类型。
[下面您将看到一些比较,最适合您的情况是请求.A
矩阵并将其切片。它显示出比.toarray()
方法快得多。当将“切片器”创建为ndarray
并乘以csr
矩阵并对结果进行切片时,使用乘法是第二快的选择。
OBS:对矩阵coo
使用A
稀疏会导致时序稍慢,保持相同的比例,并且sol3
不适用,后来我意识到在乘法运算中将其转换为csr
自动。
import scipy import scipy.sparse.csr as csr test = csr.csr_matrix([ [11,12,13,14,15,16,17,18,19], [21,22,23,24,25,26,27,28,29], [31,32,33,34,35,36,37,38,39], [41,42,43,44,45,46,47,48,49], [51,52,53,54,55,56,57,58,59], [61,62,63,64,65,66,67,68,69], [71,72,73,74,75,76,77,78,79], [81,82,83,84,85,86,88,88,89], [91,92,93,94,95,96,99,98,99]]) def sol1(): B = test.A[2:5] def sol2(): slicer = scipy.array([[0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0], [0,0,1,0,0,0,0,0,0], [0,0,0,1,0,0,0,0,0], [0,0,0,0,1,0,0,0,0]]) B = (slicer*test)[2:] return B def sol3(): B = (test[2:5]).A return B def sol4(): slicer = csr.csr_matrix( ((1,1,1),((2,3,4),(2,3,4))), shape=(5,9) ) B = ((slicer*test).A)[2:] # just changing when we do the slicing return B def sol5(): slicer = csr.csr_matrix( ((1,1,1),((2,3,4),(2,3,4))), shape=(5,9) ) B = ((slicer*test)[2:]).A return B timeit sol1() #10000 loops, best of 3: 60.4 us per loop timeit sol2() #10000 loops, best of 3: 91.4 us per loop timeit sol3() #10000 loops, best of 3: 111 us per loop timeit sol4() #1000 loops, best of 3: 310 us per loop timeit sol5() #1000 loops, best of 3: 363 us per loop
编辑:答案已经更新,用
.toarray()
代替.A
,可以得到更快的结果,现在最好的解决方案放在最前面
以上是关于[使用Python,NumPy,SciPy使用矩阵乘法对矩阵进行有效切片的主要内容,如果未能解决你的问题,请参考以下文章
Python (NumPy, SciPy),寻找矩阵的零空间