0

は、だから私はこのようになります2D配列dataを持っています。Python - 特定の条件で配列の行を選択しますか?</p> <p><a href="https://i.stack.imgur.com/3Nn0V.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/3Nn0V.png" alt="enter image description here"></a></p> <p>が、私は第二の二列の特定の条件で行数をカウントする:

1 | 0 
1 | 1 
1 | 2 

2 | 0 
2 | 1 
2 | 2 

3 | 0 
3 | 1 
3 | 2 

I:例えば、アレイのこの特定のスライスでは、私は第三の行はrange(1,4)であり、第四のrange(0,3)は、私は以下の組み合わせの全てを有することができる

1 | 2 

を有するが、与えられましたこれらの条件のそれぞれが真である行をに選択する必要があります。しかし、私はそれについてどうやって行くのか分からないのですか?私はこの2時間の作業に取り組んできましたが、私はループ、リスト内包などを使って物事を考え出しました。しかし、それはますます複雑になり、実際に働いた方法はありません。 numpyでこれを行う良い方法はありますか?

ご協力いただきありがとうございます。ありがとうございます!

答えて

1

これは動作します。1つまたは複数の条件に基づいて、アレイから行または列(または要素)を選択するための良好な汎用ツールをマスク

import numpy as np 
# data array 
data = np.array([[4,3,1,2],[4,3,5,1],[1,2,1,0]]) 
# array of acceptable combinations 
cond = np.array([[1,0],[1,2]]) 
# index of rows matching the conditions 
idx=np.array([any(np.equal(cond,row).all(1)) for row in data[:,2:]]) 
# selected rows 
data[idx] 
# array([[4, 3, 1, 2], 
# [1, 2, 1, 0]] 
+1

ohhhhh ...........私はこのようにするとは思わなかったでしょう。明らかに、私はもっと厄介なことを学ぶ必要がある!よく説明してくれてありがとうございました:) – ocean800

+0

hmmm私は '' 1 ''を得るために条件が必要なので、 '' cond = np.array([[1,0]]) 'を使いました。 0の場合。しかし、このような条件は、この例では2番目の「0」より大きいすべてを返します。それを変える方法はありますか? – ocean800

+1

あなたはそうです、 '__contains__'が書かれているので動作しません。私は答えを編集した、それは一般的なケースで動作するはずです。 – Mahdi

2

ブール。

[0,9)の範囲の整数の配列を作成します。

In [326]: arr=np.random.randint(0,10,(20,4)) 
In [327]: arr 
Out[327]: 
array([[9, 4, 1, 1], 
     [6, 1, 9, 6], 
     [5, 3, 4, 9], 
     [7, 4, 0, 4], 
     [6, 2, 3, 5], 
     [4, 5, 1, 8], 
     [0, 9, 1, 3], 
     [7, 7, 1, 5], 
     [5, 9, 6, 6], 
     [0, 9, 2, 1], 
     [4, 9, 1, 6], 
     [5, 1, 5, 2], 
     [1, 5, 2, 0], 
     [9, 0, 6, 5], 
     [1, 9, 2, 4], 
     [6, 7, 7, 9], 
     [5, 2, 5, 4], 
     [1, 6, 5, 9], 
     [0, 4, 3, 1], 
     [7, 7, 7, 7]]) 

は0と3 Pythonの間に2列の要素を探す0<x<3のようなテストをできますが、numpyだけで一方的なものすることができます。かっこは、演算子の順序を確立するために重要です。 (|または):

In [328]: mask=(0<arr[:,2:]) & (arr[:,2:]<3) 
In [329]: mask 
Out[329]: 
array([[ True, True], 
     [False, False], 
     [False, False], 
     [False, False], 
     [False, False], 
     [ True, False], 
     [ True, False], 
     [ True, False], 
     [False, False], 
     [ True, True], 
     [ True, False], 
     [False, True], 
     [ True, False], 
     [False, False], 
     [ True, False], 
     [False, False], 
     [False, False], 
     [False, False], 
     [False, True], 
     [False, False]], dtype=bool) 

いずれかの列が右の範囲内にある場合今、私たちは、行を選択することができます。

In [330]: arr[mask.any(axis=1),:] 
Out[330]: 
array([[9, 4, 1, 1], 
     [4, 5, 1, 8], 
     [0, 9, 1, 3], 
     [7, 7, 1, 5], 
     [0, 9, 2, 1], 
     [4, 9, 1, 6], 
     [5, 1, 5, 2], 
     [1, 5, 2, 0], 
     [1, 9, 2, 4], 
     [0, 4, 3, 1]]) 

またはその両方です:

In [331]: arr[mask.all(axis=1),:] 
Out[331]: 
array([[9, 4, 1, 1], 
     [0, 9, 2, 1]]) 

whereがしばしば使用されていますブール値配列をインデックス番号に変換する:

In [332]: np.where(mask.all(axis=1)) 
Out[332]: (array([0, 9], dtype=int32),) 
In [333]: arr[_,:] 
Out[333]: 
array([[[9, 4, 1, 1], 
     [0, 9, 2, 1]]]) 
関連する問題

 関連する問題