2017-02-10 8 views
0

内側の「サブアレイ」とより小さい次元数の配列の比較の結果、ブール値の配列を取得する最良の方法は何でしょうか。例えば、与えられた:numpyでのサブアレイの比較

a = array([[[[-1, -1], [-1, 1]], 
      [[-1, -1], [ 1, 1]]], 
      [[[ 0, -1], [ 1, 1]], 
      [[ 0, 1], [-1, -1]]]]) 
a.shape == (n, m, k, l) 

b = [-1, -1] 
b.shape == (l,) 

を私が手にしたいと思います:

c = array([[[True, False], 
      [True, False]], 
      [[False, False], 
      [False, True]]]) 
c.shape == (n, m, k) 

しかし、一般的に私たちは想像:

b.shape == (k, l) 
c.shape == (n, m) 
+0

「a.shape」とは何ですか? –

+0

その情報を質問に追加しました。 –

答えて

2

てみてください:

logical_and.reduce(a == b, axis = -1) 

bの形状は、あなたが直接aと同じ形状の論理配列を返す点毎に比較します==演算子を適用することができますので、それが自動的に放送されるaの最後の次元に一致するとして。削減操作(1でndimを減らす)唯一の真の値

第二の例(axisパラメータの違いに気づくようにしてください)を含むすべての「行」のために、trueを返します:

>>> b = [[-1,-1],[-1,1]]                            
>>> logical_and.reduce(a == b, axis = (-2,-1)) 
array([[ True, False],                                  
     [False, False]], dtype=bool)                               
+2

もっと一般的には、 'axis = tuple(範囲(-b.ndim、0))' –

+0

私は、縮小方法が複数の軸をサポートしていたという事実を知らなかった。いつ利用可能になったのですか? –

+0

@MadPhysicist正直言って私はこれらの繊細さを保存していません、それはもっと試行錯誤です。しかし私は最近タプル軸argsの概念を見つけただけです。そう、彼らは比較的新しい追加かもしれない。 –

1

以来のabの最後の次元が一致する場合、式a == bは、ブール値の配列aに正しくブロードキャストされます。

サブアレイのすべての要素が一致するかどうかを知りたいので、最後のディメンションをnp.all(a == b, axis=-1)で減らすことができます。

bが多次元の場合、np.allはまだ適切な次元の順序を受け入れていないので、最後の次元を1つにラベリングする必要があります。 shp = a.shape[:-b.ndim] + (b.size,); np.all((a == b).reshape(shp), axis=-1)のようなものは、一般的なケースで動作するはずです。

更新

どうやらnp.allは現在、いくつかの時間のためのaxis引数として軸のタプルをサポートしてきました。その後、一般的なケースは大幅に簡略化してnp.all(a == b, axis=tuple(range(-b.ndim, 0)))になります。これは1Dのケースでもうまく動作します。

関連する問題