1

文字列のリストを繰り返し処理し、それらを1、-1、および0の配列に変換しています。例-私は次のリストを持っているかもしれません:

A,B,-C
A,-D
B,C,-D

これは、次のような「ビッグリスト」になります。

[
 [1  1 -1  0],
 [1  0  0 -1],
 [0  1  1 -1]
]

現時点では、文字列のすべての行をループし、文字列が一意である場合は1または-1の値を割り当て、存在しないものをゼロにします(たとえば、最初の文字列にはDが存在しません)。行なので、0です)。私が上記をやっているばかげた方法は基本的に:

for line_of_strings in all_strings:
    for the_string in line_of_strings:
        entry[string_index] = (1 or -1)

    biglist.append(entry)

最終的に、私は実行するリストの素晴らしいセットを持っています:

scipy.optimize.nnls(biglist)

これは機能しますが、トラックのメモリと時間を消費することになります。これを実行するためのより効率的な方法はありますか?numpyまたはscipyの配列/行列を使用していますか?

4

1 に答える 1

1

リストの代わりにnumpy配列を使用すると、少なくとも些細な例では、時間的にかなりの違いが生じるようです。

$ python -mtimeit -s"from scipy.optimize import nnls; m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]; b=[1, 2, 3]" "nnls(m, b)"
10000 loops, best of 3: 38.5 usec per loop

$ python -mtimeit -s"import numpy as np; from scipy.optimize import nnls; m = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]); b=[1, 2, 3]" "nnls(m, b)"
100000 loops, best of 3: 20 usec per loop

$ python -mtimeit -s"import numpy as np; from scipy.optimize import nnls; m = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]); b=np.array([1, 2, 3])" "nnls(m, b)"
100000 loops, best of 3: 11.4 usec per loop

numpy配列の方がメモリフットプリントも小さいと思います。入力が適度にスパースであり、それでもパフォーマンスが十分でない場合は、nnlsスパース行列を受け入れるかどうかを調査する価値があるかもしれません。

于 2012-11-11T23:07:22.600 に答える