NumPy配列のゼロのみを含むすべての行を試しています。たとえば、から削除[0,0]
したい
n = np.array([[1,2], [0,0], [5,6]])
そして残されます:
np.array([[1,2], [5,6]])
numpyテーブルから2番目の行を削除するには:
import numpy
n = numpy.array([[1,2],[0,0],[5,6]])
new_n = numpy.delete(n, 1, axis=0)
0のみを含む行を削除するには:
import numpy
n = numpy.array([[1,2],[0,0],[5,6]])
idxs = numpy.any(n != 0, axis=1) # index of rows with at least one non zero value
n_non_zero = n[idxs, :] # selection of the wanted rows
ゼロのみを含む行を削除したい場合、私が考えることができる最速の方法は次のとおりです。
n = numpy.array([[1,2], [0,0], [5,6]])
keep_row = n.any(axis=1) # Index of rows with at least one non-zero value
n_non_zero = n[keep_row] # Rows to keep, only
これは、Simonの回答よりもはるかに高速に実行されます。これn.any()
は、ゼロ以外の値に遭遇するとすぐに各行の値のチェックを停止するためです(Simonの回答では、各行のすべての要素が最初にゼロと比較されるため、不要な計算が発生します)。
特定の値を持つ行を削除する必要がある場合(ゼロのみを含む行のみを削除するのではなく)、答えの一般化を次に示します。
n = numpy.array([[1,2], [0,0], [5,6]])
to_be_removed = [0, 0] # Can be any row values: [5, 6], etc.
other_rows = (n != to_be_removed).any(axis=1) # Rows that have at least one element that differs
n_other_rows = n[other_rows] # New array with rows equal to to_be_removed removed.
このソリューションは完全には最適化されていないことに注意してください。の最初の要素がto_be_removed
一致しない場合でも、の残りの行要素は(Simonの回答のように)の要素n
と比較されます。to_be_removed
特定の値を持つ行を削除するというより一般的な問題に対して、単純で効率的なNumPyソリューションがあるかどうかを知りたいと思います。
Cythonループを使用すると、迅速な解決策になる可能性があります。各行について、行の1つの要素がの対応する要素と異なるとすぐに要素の比較を停止できますto_be_removed
。
numpy.delete
特定の行または列を削除するために使用できます。
例えば:
n = [[1,2], [0,0], [5,6]]
np.delete(n, 1, axis=0)
出力は次のようになります。
array([[1, 2],
[5, 6]])
オブジェクトである値に従って削除します。
このようにするには:
>>> n
array([[1, 2],
[0, 0],
[5, 6]])
>>> bl=n==[0,0]
>>> bl
array([[False, False],
[ True, True],
[False, False]], dtype=bool)
>>> bl=np.any(bl,axis=1)
>>> bl
array([False, True, False], dtype=bool)
>>> ind=np.nonzero(bl)[0]
>>> ind
array([1])
>>> np.delete(n,ind,axis=0)
array([[1, 2],
[5, 6]])