行列の乗算を使用すると、適切な場所にある「スライサー」行列を作成する効率的なスライスを行うことができます。スライスされたマトリックスはtype
「スライサー」と同じになるため、出力タイプを効率的に制御できます。
.A
以下にいくつかの比較を示しますが、最も効率的なケースは、マトリックスを求めてそれをスライスすることです。メソッドよりもはるかに高速であることが示されました.toarray()
。「スライサー」が として作成さndarray
れ、行列で乗算されcsr
、結果がスライスされる場合、乗算の使用は 2 番目に高速なオプションです。
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
、はるかに高速な結果が得られ、最適なソリューションが一番上に配置されるようになりました