2016-11-05 82 views
1

我有一個numpy數組的M*N維度,其中數組的每個元素爲float,其值介於0-1之間。獲得列組合的乘法運算的最大值及其在Python中的各自索引

輸入:爲了簡單的目的讓我們考慮一個3×4陣列:

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] 
]) 

我要考慮3列在一個時間(比如山坳0,1,2對於第一次迭代和1,2,3爲第二),並獲得最大的價值乘以3列的所有可能的組合並且也獲得它們各自值的索引。

在這種情況下,我應該得到最大值0.5*0.6*0.8=0.24和給出最大值的值的行的索引:在這種情況下爲(2,2,1)

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

我可以做到這一點使用循環,但我想避免他們,因爲它會影響運行時間,反正是有,我可以做到這一點在numpy

回答

1

下面是一個使用NumPy strides的方法是假想非常有效的這種滑動窗口的操作,因爲它creates a view into the array沒有實際製作副本 -

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]) 

我們可以壓縮這兩個輸出如果需要一起使用那種格式 -

In [75]: zip(out2,map(tuple,out1)) 
Out[75]: [(0.23999999999999999, (2, 2, 1)), (0.33599999999999997, (2, 1, 1))] 
相關問題