2016-11-05 3 views
1

numpyの配列はM*Nで、配列の各要素は0〜1の値を持つfloatです。列の組み合わせの乗算の最大値とそれぞれのインデックスをPythonで得る

入力:私は一度に3つの列を検討したい

a=np.array([ 
[0.1, 0.2, 0.3, 0.6], 
[0.3, 0.4, 0.8, 0.7], 
[0.5, 0.6, 0.2, 0.1] 
]) 

(最初の反復と第二のために1,2,3ためCOL 0,1,2を言う)と最大値を取得:単純化の目的のために3 * 4の配列を考慮することができます3つの列のすべての可能な組み合わせの乗算を行い、それぞれの値のインデックスも得る。

この場合、最大値は0.5*0.6*0.8=0.24で、最大値を与えた値の行のインデックスは(2,2,1)です。

出力:[[0.24,(2,2,1)],[0.336,(2,1,1)]]

私はこの使用してループを行うことができますが、私はそれが時間を実行している影響を与えるとしてそれらを避けたいと思うが、とにかく私はnumpyでそれを行うことができますがありますか?

答えて

1

ここでは、実際にコピーせずに、それcreates a view into the arrayとして、ウィンドウ操作をスライドさせるようにするためにおそらく非常に効率的であるNumPy stridesを使ったアプローチだ -

N = 3 # Window size 
m,n = a.strides 
p,q = a.shape 
a3D = np.lib.stride_tricks.as_strided(a,shape=(p, q-N +1, N),strides=(m,n,n)) 
out1 = a3D.argmax(0) 
out2 = a3D.max(0).prod(1) 

サンプル実行 -

In [69]: a 
Out[69]: 
array([[ 0.1, 0.2, 0.3, 0.6], 
     [ 0.3, 0.4, 0.8, 0.7], 
     [ 0.5, 0.6, 0.2, 0.1]]) 

In [70]: out1 
Out[70]: 
array([[2, 2, 1], 
     [2, 1, 1]]) 

In [71]: out2 
Out[71]: array([ 0.24 , 0.336]) 

我々は、これらの2つの出力をzip圧縮することができますが、その形式で必要なら一緒に -

In [75]: zip(out2,map(tuple,out1)) 
Out[75]: [(0.23999999999999999, (2, 2, 1)), (0.33599999999999997, (2, 1, 1))] 
関連する問題