8

numpy 配列でスパース行列を初期化したい。numpy 配列には、私のプログラムではゼロとして NaN が含まれています。次のようにスパース行列を初期化するコードです。

a= np.array([[np.NaN,np.NaN,10]])
zero_a= np.array([[0,0,10]])
spr_a = lil_matrix(a)
zero_spr_a = lil_matrix(zero_a)
print repr(spr_a)
print repr(zero_spr_a)

出力は

タイプ 'type 'numpy.float64'' の 1x3 スパース行列
    リンクされたリスト形式で 3 つの要素が格納されている
タイプ 'type 'numpy.int64'' の 1x3 スパース行列
    リンクされたリスト形式で 1 ​​つの格納された要素を持つ

0 の配列の場合、疎行列に格納される要素は 1 つだけです。NaN配列には3つの要素が格納されていますが、scipy行列のNaNをゼロとして扱う方法は?

4

2 に答える 2

6

データから疎行列を作成し、NaNs をゼロのように扱いたいだけの場合は、次のようにすることができます。まず、複数np.nanの を含むランダムな配列を作成します。

>>> nans = np.random.randint(0, 2, size=(5,5))
>>> a = np.ones((5,5))
>>> a = np.where(nans, np.nan, a)
>>> a
array([[  1.,   1.,   1.,   1.,  nan],
       [ nan,  nan,  nan,   1.,   1.],
       [ nan,  nan,   1.,   1.,  nan],
       [  1.,   1.,   1.,   1.,  nan],
       [  1.,  nan,   1.,  nan,  nan]])

これを COO 形式でスパースにするには、次のように簡単です。

>>> indices = np.nonzero(~np.isnan(a))
>>> sps = scipy.sparse.coo_matrix((a[indices], indices), shape=a.shape)
>>> sps
<5x5 sparse matrix of type '<type 'numpy.float64'>'
    with 14 stored elements in COOrdinate format>

そして、それらが同じであることを確認するには:

>>> sps.toarray()
array([[ 1.,  1.,  1.,  1.,  0.],
       [ 0.,  0.,  0.,  1.,  1.],
       [ 0.,  0.,  1.,  1.,  0.],
       [ 1.,  1.,  1.,  1.,  0.],
       [ 1.,  0.,  1.,  0.,  0.]])

あなたNaNのはもうなくなっていますが...

于 2013-01-17T18:22:31.063 に答える
2

スパース行列の空の値としてゼロを使用することは、コードに深く根付いているため、残念ながら変更するのは簡単ではありません。

NaNまず、または他の値を疎行列の空の値として扱う必要性を再考します。おそらく、あなたのコードには別の方法がありますか?

スパース行列の空の値を本当に変更する必要がある場合は、 に基づいて、lil_matrixまたはさらに に基づいて新しいクラスを定義する必要がありますspmatrixget nnz()最も重要なことは、ゼロ以外のポイントの数を定義するメソッドを変更する必要があることです。ただし、マトリックスを再定義する必要もあります。これは、そのままnp.matrixオブジェクト dtype としてキャストされ、その過程でゼロがクリアされるためです。

于 2013-01-17T17:35:55.193 に答える