2017-10-23 21 views
1

私はscipyスパース行列dataと削除するdataの行にcorrupsonds整数nを持っています。この行を削除するには、私はこれを試してみました:scipyマトリックスから行を削除

data = sparse.csr_matrix(np.delete(np.array(data),n, axis=0)) 

しかし、これはこのエラーを生成:

Traceback (most recent call last): 
    File "...", line 260, in <module> 
    X_labeled = sparse.csr_matrix(np.delete(np.array(X_labeled),n, axis=0)) 
    File "/anaconda3/lib/python3.6/site-packages/scipy/sparse/compressed.py", line 79, in __init__ 
    self._set_self(self.__class__(coo_matrix(arg1, dtype=dtype))) 
    File "/anaconda3/lib/python3.6/site-packages/scipy/sparse/coo.py", line 177, in __init__ 
    self.row, self.col = M.nonzero() 
SystemError: <built-in method nonzero of numpy.ndarray object at 0x113c883f0> returned a result with an error set 

私が実行します。

data = np.delete(data.toarray(),n, axis=0) 

私はこのエラーを取得する:

Traceback (most recent call last): 
    File "...", line 261, in <module> 
    X_labeled = np.delete(X_labeled.toarray(),n, axis=0) 
    File "/anaconda3/lib/python3.6/site-packages/numpy/lib/function_base.py", line 4839, in delete 
    "size %i" % (obj, axis, N)) 
IndexError: index 86 is out of bounds for axis 0 with size 4 

実行したとき:

print(type(data)) 
print(data.shape) 
print(data.toarray().shape) 

私はこれを取得:

<class 'scipy.sparse.csr.csr_matrix'> 
(4, 2740) 
(4, 2740) 
+0

あなたのデータは何のように見えるん:


ブールマスクを作りますか?この簡単なデータで行を実行すると、 'data = np.array([1,2,3,4,5,6])'となります。 –

+0

疎な行列を密度の高い配列にする正しい方法は 'data.toarray()'です。 – hpaulj

+0

削除したい行インデックス以外のすべての行インデックスで 'data'をインデックス化してみませんか? – hpaulj

答えて

1

密なものにスパース行列をオンにする正しい方法はとtoarray、ないnp.array(...)次のとおりです。

In [408]: M = sparse.csr_matrix(np.eye(3)) 
In [409]: M 
Out[409]: 
<3x3 sparse matrix of type '<class 'numpy.float64'>' 
    with 3 stored elements in Compressed Sparse Row format> 
In [410]: np.array(M) 
Out[410]: 
array(<3x3 sparse matrix of type '<class 'numpy.float64'>' 
    with 3 stored elements in Compressed Sparse Row format>, dtype=object) 

これは、単一の要素オブジェクトでありますスパース行列を含むdtype配列 - 変更されていません。この正しい配列を持つ

In [411]: M.toarray() 
Out[411]: 
array([[ 1., 0., 0.], 
     [ 0., 1., 0.], 
     [ 0., 0., 1.]]) 

delete作品:

In [414]: data = sparse.csr_matrix(np.delete(M.toarray(),1, axis=0)) 
In [415]: data 
Out[415]: 
<2x3 sparse matrix of type '<class 'numpy.float64'>' 
    with 2 stored elements in Compressed Sparse Row format> 
In [416]: data.A 
Out[416]: 
array([[ 1., 0., 0.], 
     [ 0., 0., 1.]]) 

インデックスが同じことを行います:

In [417]: M[[0,2],:] 
Out[417]: 
<2x3 sparse matrix of type '<class 'numpy.float64'>' 
    with 2 stored elements in Compressed Sparse Row format> 
In [418]: _.A 
Out[418]: 
array([[ 1., 0., 0.], 
     [ 0., 0., 1.]]) 
In [420]: M[np.array([True,False,True]),:].A 
Out[420]: 
array([[ 1., 0., 0.], 
     [ 0., 0., 1.]]) 

を私はインデックスルートが高速であることを推測するだろうが、我々は持っているだろう現実的なサイズのアレイについての時間テストを確実に行うこと。

内部ではdeleteはかなり複雑ですが、入力によってはこのようなことがあります。削除する行にブール値の配列Falseを作成します。

In [421]: mask=np.ones((3,),bool) 
In [422]: mask[1]=False 
In [423]: M[mask,:].A 
+0

私はあなたが 'todense()'メソッドを意味すると思う..ああ、とにかくそれが行列ではないことを心配しないでください – percusse

+0

'todense'は' np.matrix'を行い、 'toarray'は' np.ndarray'をカット)。 – hpaulj

関連する問題