我想将 2d(让我们称之为)重塑为 2d scipy.sparse.csr.csr_matrix
(让A
我们numpy.ndarray
称之为B
)。
A
可能
>shape(A)
(90, 10)
那么
B
应该是
>shape(B)
(9,10)
其中每 10 行将A
被重塑为一个新的新值,即该窗口和列的最大值。列运算符不适用于这种不可散列的稀疏矩阵类型。我怎样才能B
通过使用矩阵乘法得到这个?
我想将 2d(让我们称之为)重塑为 2d scipy.sparse.csr.csr_matrix
(让A
我们numpy.ndarray
称之为B
)。
A
可能
>shape(A)
(90, 10)
那么
B
应该是
>shape(B)
(9,10)
其中每 10 行将A
被重塑为一个新的新值,即该窗口和列的最大值。列运算符不适用于这种不可散列的稀疏矩阵类型。我怎样才能B
通过使用矩阵乘法得到这个?
使用矩阵乘法,您可以进行有效的切片,在正确的位置创建一个“切片器”矩阵。切片矩阵将type
与“切片器”相同,因此您可以有效地控制输出类型。
下面你会看到一些比较,对你来说最有效的情况是请求.A
矩阵并对其进行切片。.toarray()
它显示比该方法快得多。当“切片器”创建为 a 时,使用乘法是第二快的选项ndarray
,乘以csr
矩阵并切片结果。
OBS:使用coo
稀疏矩阵A
导致时间稍慢,保持相同的比例,并且sol3
不适用,后来我意识到在乘法中它会csr
自动转换为a。
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
,提供更快的结果,现在最好的解决方案放在首位