4

scipy.sparse.csr.csr_matrix2d (これを と呼びましょうA) を 2d numpy.ndarray(これを と呼びましょう)に変形したいと思いBます。

Aになり得る

>shape(A)
(90, 10)

それから Bあるべきです

>shape(B)
(9,10)

ここで、各 10 行がA新しい新しい値、つまりこのウィンドウと列の最大値に再形成されます。列演算子は、このハッシュ不可能なタイプのスパース マトリックスでは機能しません。B行列の乗算を使用してこれを取得するにはどうすればよいですか?

4

1 に答える 1

3

行列の乗算を使用すると、適切な場所にある「スライサー」行列を作成する効率的なスライスを行うことができます。スライスされたマトリックスは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、はるかに高速な結果が得られ、最適なソリューションが一番上に配置されるようになりました

于 2013-05-12T11:48:12.263 に答える