ゼロのみを含むスパース行列から列を効率的に削除するための最良の方法は何ですか。作成してデータを入力したマトリックスがあります。
matrix = sp.sparse.lil_matrix((100, 100))
ここで、ゼロデータのみを含む最後の20列を削除したいと思います。これどうやってするの?
ゼロのみを含むスパース行列から列を効率的に削除するための最良の方法は何ですか。作成してデータを入力したマトリックスがあります。
matrix = sp.sparse.lil_matrix((100, 100))
ここで、ゼロデータのみを含む最後の20列を削除したいと思います。これどうやってするの?
これが単なるnumpy配列である場合、と同じ形状のブール配列が得られるX
と言うことができます。次に、ブール配列でインデックスを作成できます。X!=0
X
X
non_zero_entries = X[X!=0]
しかし、これはブールインデックスをサポートしないスパース行列であり、試してみても必要なものが得られません。これはX!=0
、(メモリ内の)まったく同じ行列である場合にのみtrueを返すように見える単一のブール値を返すだけです。 。
あなたが欲しいのはnonzero
numpyからのメソッドです。
import numpy as np
from scipy import sparse
X = sparse.lil_matrix((100,100)) # some sparse matrix
X[1,17] = 1
X[17,17] = 1
indices = np.nonzero(X) # a tuple of two arrays: 0th is row indices, 1st is cols
X.tocsc()[indices] # this just gives you the array of all non-zero entries
ゼロ以外のエントリがある完全な列のみが必要な場合は、インデックスから1番目を取得します。繰り返されるインデックスを考慮する必要がある場合を除いて(列に複数のエントリがある場合):
columns_non_unique = indices[1]
unique_columns = sorted(set(columns_non_unique))
X.tocsc()[:,unique_columns]
これは方法のように見えますが、理想的には効率的ではありません。
matrix = matrix[0:100,0:80]
scipy.sparse.find()
スパース行列内のすべての非ゼロ要素の位置を取得するために使用することもできます
。
戻り値の[1]
thエントリは、列番号のnumpy配列です。この配列から一意の値を取得すると、ゼロ以外の列のインデックスが得られます。これらの列で元のスパース行列をサブセット化すると、ゼロ以外の列が得られます。
x[:,np.unique(sparse.find(x)[1])]
これを拡張して、少なくともn個のエントリを持つ列を見つけることができます。
idx = np.unique(sparse.find(x)[1], return_counts=True)
x[:, idx[0][idx[1] > n]]