2017-08-18 3 views
-1

あるだからのような非常に大きな二次元numpyの配列を有する:私はすぐにnp.sum(row[2:5]) == 0削除行複数のインデックスの和が0

アレイのそれぞれの行を削除したい

array([[ 2, 4, 0, 0, 0, 5, 9, 0], 
     [ 2, 3, 0, 1, 0, 3, 1, 1], 
     [ 1, 5, 4, 3, 2, 7, 8, 3], 
     [ 0, 7, 0, 0, 0, 6, 4, 4], 
     ..., 
     [ 6, 5, 6, 0, 0, 1, 9, 5]]) 

私がこれを行うと考えることができる唯一の方法はforループを使うことですが、何百万行もある場合は非常に時間がかかります。さらに、これはPython 2.7に制限する必要があります。

答えて

1

ブール式をインデックスとして使用できます。それらを使用して配列をマスクすることができます。

inputarray = array([[ 2, 4, 0, 0, 0, 5, 9, 0], 
        [ 2, 3, 0, 1, 0, 3, 1, 1], 
        [ 1, 5, 4, 3, 2, 7, 8, 3], 
        [ 0, 7, 0, 0, 0, 6, 4, 4], 
        ..., 
        [ 6, 5, 6, 0, 0, 1, 9, 5]]) 

mask = numpy.sum(inputarray[:,2:5], axis=1) != 0 
result = inputarray[mask,:] 

これが何をやっている:

  • inputarray[:, 2:5]

    はあなたが
  • axis=1は、我々は我々が維持したい
  • 列に合計をやっている意味
  • にわたり合計するすべての列を選択し、
    合計行が でない行ゼロ
  • このマスクは、ブール式がTrue
0

ここのSA行インデックスとは、行を選択別の解決策は、合計を計算するnumpy.apply_along_axisを使用して、ブール値としてそれをキャストし、そしてあなたのインデックスのためにそれを使用することです:

my_arr = np.array([[ 2, 4, 0, 0, 0, 5, 9, 0], 
     [ 2, 3, 0, 1, 0, 3, 1, 1], 
     [ 1, 5, 4, 3, 2, 7, 8, 3], 
     [ 0, 7, 0, 0, 0, 6, 4, 4],]) 
my_arr[np.apply_along_axis(lambda x: bool(sum(x[2:5])), 1, my_arr)] 

array([[2, 3, 0, 1, 0, 3, 1, 1], 
     [1, 5, 4, 3, 2, 7, 8, 3]]) 

0以外の数字はTrueになるので、合計をあまりにも大きくするだけです。

あなたが列に興味がある
0
>>> a 
array([[2, 4, 0, 0, 0, 5, 9, 0], 
     [2, 3, 0, 1, 0, 3, 1, 1], 
     [1, 5, 4, 3, 2, 7, 8, 3], 
     [0, 7, 0, 0, 0, 6, 4, 4], 
     [6, 5, 6, 0, 0, 1, 9, 5]]) 

あなたは、各行にそれらの列の合計を見つけたい5

>>> a[:,2:5] 
array([[0, 0, 0], 
     [0, 1, 0], 
     [4, 3, 2], 
     [0, 0, 0], 
     [6, 0, 0]]) 
>>> b = a[:,2:5] 

2〜

>>> sum_ = b.sum(1) 
>>> sum_ 
array([0, 1, 9, 0, 6]) 

これらはあなたの基準を満たす行です

>>> sum_ != 0 
array([False, True, True, False, True], dtype=bool) 
>>> keep = sum_ != 0 

boolean indexingを使用してこれらの行を選択します。

>>> a[keep, :] 
array([[2, 3, 0, 1, 0, 3, 1, 1], 
     [1, 5, 4, 3, 2, 7, 8, 3], 
     [6, 5, 6, 0, 0, 1, 9, 5]]) 
>>> 
関連する問題