98

次のような配列があります。

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)

しかし、何らかの理由で、このコードは何もしていないように見えますが、多くの印刷コマンドを実行すると、すべての変数がコードに至るまで正しく入力されているように見えます。

「ゼロ値を含む行を削除する」簡単な方法が必要です。

これを達成するためにどのコードを書くべきかを誰かに教えてもらえますか?

4

6 に答える 6

185

配列から行と列を削除する最も簡単な方法は、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 番目の引数として渡すことができます。

于 2012-07-26T05:48:21.327 に答える
14

ここにワンライナーがあります(はい、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 の方法 (彼のコメントから) は、私のテストではわずかに高速でした。

于 2010-10-07T03:33:29.393 に答える
5

これは元のアプローチに似ており、unutbu'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()は私にはうまくいきません - ndarrays には.delete属性がありません。

于 2010-10-06T23:14:01.313 に答える
2

numpyは、まったく同じことを行うための単純な関数を提供します。マスクされた配列'a'があるとすると、numpy.ma.compress_rows(a)を呼び出すと、マスクされた値を含む行が削除されます。私はこれがこの方法ではるかに速いと思います...

于 2011-04-21T12:12:09.243 に答える
1
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.)])
于 2018-08-20T20:29:53.073 に答える