获取python中列组合及其各自索引的最大乘法值

获取python中列组合及其各自索引的最大乘法值,python,arrays,performance,numpy,vectorization,Python,Arrays,Performance,Numpy,Vectorization,我有一个numpy数组,数组的M*N维度,其中数组的每个元素都是一个float,值在0-1之间 输入:为了简单起见,让我们考虑一个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列(例如COLL代码>0,1,2</代码>第一次迭代和 1,2,3/代码>第二次),得到3列的所有可能组合的最大值,并得到它们各自的值的索引。 在这种情况下,我应该得到0.5*0

我有一个
numpy
数组,数组的
M*N
维度,其中数组的每个元素都是一个
float
,值在0-1之间

输入:为了简单起见,让我们考虑一个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列(例如COLL代码>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
中,我是否可以做到这一点?

这里有一种使用循环的方法,这种方法对于滑动窗口操作非常有效,因为它不需要实际制作副本-

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