[使用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中创建随机正交矩阵

Python (NumPy, SciPy),寻找矩阵的零空间

如何将“SciPy 稀疏矩阵”转换为“NumPy 矩阵”?

Python scipy/numpy中相关性的层次聚类?

在 Python / NumPy 中计算矩阵的 Jordan 范式

Python机器学习(五十二)SciPy 基础功能