次のような配列があります。
ANOVAInputMatrixValuesArray = [[ 0.96488889, 0.73641667, 0.67521429, 0.592875,
0.53172222], [ 0.78008333, 0.5938125, 0.481, 0.39883333, 0.]]
行の1つの最後にゼロ値があることに注意してください。すべてのセルにゼロ以外の値を含む行を保持しながら、ゼロを含む行を削除したい。
ただし、配列にはデータが入力されるたびに行数が異なり、ゼロは毎回異なる行に配置されます。
次のコード行を使用して、各行の非ゼロ要素の数を取得します。
NumNonzeroElementsInRows = (ANOVAInputMatrixValuesArray != 0).sum(1)
上記の配列の場合、NumNonzeroElementsInRows
には以下が含まれます:[5 4]
5つは、行0のすべての可能な値がゼロ以外であることを示し、4つは、行1の可能な値の1つがゼロであることを示します。
したがって、次のコード行を使用して、ゼロ値を含む行を検索および削除しようとしています。
for q in range(len(NumNonzeroElementsInRows)):
if NumNonzeroElementsInRows[q] < NumNonzeroElementsInRows.max():
p.delete(ANOVAInputMatrixValuesArray, q, axis=0)
しかし、何らかの理由で、多くの印刷コマンドを実行すると、すべての変数がコードに至るまで正しく読み込まれているように見えても、このコードは何もしないようです。
「ゼロ値を含む行を削除する」簡単な方法が必要です。
誰もこれを達成するためにどのコードを書くべきか教えてもらえますか?
配列から行と列を削除する最も簡単な方法は、numpy.delete
メソッドです。
次の配列x
があるとします:
x = array([[1,2,3],
[4,5,6],
[7,8,9]])
最初の行を削除するには、次を実行します。
x = numpy.delete(x, (0), axis=0)
3番目の列を削除するには、次の操作を行います。
x = numpy.delete(x,(2), axis=1)
したがって、0を含む行のインデックスを見つけ、それらをリストまたはタプルに入れて、これを関数の2番目の引数として渡すことができます。
ライナーは1つです(はい、user333700に似ていますが、もう少し簡単です):
>>> import numpy as np
>>> arr = np.array([[ 0.96488889, 0.73641667, 0.67521429, 0.592875, 0.53172222],
[ 0.78008333, 0.5938125, 0.481, 0.39883333, 0.]])
>>> print arr[arr.all(1)]
array([[ 0.96488889, 0.73641667, 0.67521429, 0.592875 , 0.53172222]])
ところで、この方法は、大きな行列のマスク配列法よりもはるかに高速です。 2048 x 5マトリックスの場合、この方法は約1000倍高速です。
ちなみに、user333700のメソッド(彼のコメントから)は、私のテストではわずかに高速でしたが、なぜだろうかと思いました。
これは元のアプローチに似ており、 nutbu's answer よりも使用するスペースが少なくなりますが、遅くなると思われます。
>>> import numpy as np
>>> p = np.array([[1.5, 0], [1.4,1.5], [1.6, 0], [1.7, 1.8]])
>>> p
array([[ 1.5, 0. ],
[ 1.4, 1.5],
[ 1.6, 0. ],
[ 1.7, 1.8]])
>>> nz = (p == 0).sum(1)
>>> q = p[nz == 0, :]
>>> q
array([[ 1.4, 1.5],
[ 1.7, 1.8]])
ちなみに、あなたの行p.delete()
は機能しません-ndarray
sには.delete
属性がありません。
numpyは、まったく同じことを行う単純な関数を提供します。仮にマスクされた配列 'a'がある場合、numpy.ma.compress_rows(a)を呼び出すと、マスクされた値を含む行が削除されます。この方法の方がずっと速いと思います...
import numpy as np
arr = np.array([[ 0.96488889, 0.73641667, 0.67521429, 0.592875, 0.53172222],[ 0.78008333, 0.5938125, 0.481, 0.39883333, 0.]])
print(arr[np.where(arr != 0.)])