Python 获取NumPy数组中最大区域的索引

Python 获取NumPy数组中最大区域的索引,python,numpy,Python,Numpy,假设我有以下区域坐标数组[x1,y1,x2,y2]。在我的例子中,这些坐标描述了图像中检测到的人脸区域: [ [1, 1, 41, 41], [134, 13, 154, 33] ] 现在,我想得到最大面积的指数,或者是最大面积本身的指数。我知道我可以迭代数组,计算每个条目的面积,然后排序得到最大的条目。Python中的标准循环速度非常慢,因此我正在寻找一种可以加快速度的NumPy解决方案(假设该阵列中有1毫米的单独区域) 在上面的示例中,我希望得到一个数组索引0或区域本身[1

假设我有以下区域坐标数组
[x1,y1,x2,y2]
。在我的例子中,这些坐标描述了图像中检测到的人脸区域:

[
    [1, 1, 41, 41],
    [134, 13, 154, 33]
]
现在,我想得到最大面积的指数,或者是最大面积本身的指数。我知道我可以迭代数组,计算每个条目的面积,然后排序得到最大的条目。Python中的标准循环速度非常慢,因此我正在寻找一种可以加快速度的NumPy解决方案(假设该阵列中有1毫米的单独区域)


在上面的示例中,我希望得到一个数组索引
0
或区域本身
[1,1,41,41]
,因为它是这两个索引中最大的一个(就面积而言,它是最大的,而不是坐标本身).

不确定内存的限制,但如果将
numpy
numexpr
相结合,则在>1小时的计算时间内可能达到1MM<当算术简单时,code>numexpr是一个不错的选择。我对这些选项进行了实验,发现
max
方法在numpy上速度最快,而算术在
numexpr
上速度更快:

import numpy as np
import numexpr as ne
a = np.random.randint(10000000, size=(100000000, 4))
a[:,2] = a[:,0]+a[:,2]
a[:,3] = a[:,1]+a[:,3]
x,y,z,t = a[:,0], a[:,1], a[:,2], a[:,3]
%timeit np.max((z-x) * (t-y)) 
%timeit ne.evaluate('max((z-x) * (t-y))')
%timeit np.max(ne.evaluate('(z-x) * (t-y)'))
输出: 相比之下,
max
项的索引如下所示:

%timeit np.argmax((z-x) * (t-y)) 
%timeit np.argmax(ne.evaluate('(z-x) * (t-y)'))
输出:
在这种情况下,简单的数组算术就足够了吗?这足以为示例中的每个项目计算面积
(a[2]-a[0])*(a[3]-a[1])
,然后找到最大项目的索引。由于我们使用的是
numpy
,因此不需要迭代。请不要在没有解释的情况下否决投票。我很乐意解决您的问题。
%timeit np.argmax((z-x) * (t-y)) 
%timeit np.argmax(ne.evaluate('(z-x) * (t-y)'))
1.02 s ± 17.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
317 ms ± 8.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)