6

numpyでは、行列(要素)の各エントリの正弦を計算する場合は、

a = numpy.arange(0,27,3).reshape(3,3)
numpy.sin(a)

仕事を成し遂げます!パワーが必要な場合は、各エントリの2つにしましょう

a**2

それをします。

しかし、スパース行列がある場合、物事はより困難に思えます。少なくとも、lil_matrix形式の各エントリを繰り返し処理して操作する以外に、それを行う方法を考えていません。

私はSOでこの質問を見つけ、この答えを適応させようとしましたが、成功しませんでした。

目標は、CSR形式のscipy.sparse行列の平方根(または1/2の累乗)を要素ごとに計算することです。

あなたは何を提案しますか?

4

1 に答える 1

11

次のトリックは、ゼロ以外の要素にのみ触れるため、ゼロからゼロにマップするすべての操作で機能し、それらの操作でのみ機能します。つまり、は機能しますが、は機能しsinませsqrtcos

XCSRマトリックスにしましょう...

>>> from scipy.sparse import csr_matrix
>>> X = csr_matrix(np.arange(10).reshape(2, 5), dtype=np.float)
>>> X.A
array([[ 0.,  1.,  2.,  3.,  4.],
       [ 5.,  6.,  7.,  8.,  9.]])

ゼロ以外の要素の値は次のX.dataとおりです。

>>> X.data
array([ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9.])

インプレースで更新できます。

>>> X.data[:] = np.sqrt(X.data)
>>> X.A
array([[ 0.        ,  1.        ,  1.41421356,  1.73205081,  2.        ],
       [ 2.23606798,  2.44948974,  2.64575131,  2.82842712,  3.        ]])

更新SciPyの最近のバージョンでは、スパース行列X.sqrt()がどこにあるかなどを実行Xして、の要素の平方根を含む新しいコピーを取得できますX

于 2012-01-18T09:18:21.220 に答える