使用NumPy从矩阵获取最小/最大n值和索引的有效方法
给定NumPy矩阵(2D数组),返回数组中的最小值/最大值n
(及其索引)的有效方法是什么?
目前我有:
def n_max(arr, n): res = [(0,(0,0))]*n
for y in xrange(len(arr)):
for x in xrange(len(arr[y])):
val = float(arr[y,x])
el = (val,(y,x))
i = bisect.bisect(res, el)
if i > 0:
res.insert(i, el)
del res[0]
return res
这比pyopencv
用于生成要在其上运行数组的图像模板匹配算法要长三倍,而我认为这很愚蠢。
回答:
从另一个答案开始,NumPy添加了numpy.partition
和numpy.argpartition
函数进行部分排序,使您可以及时执行此O(arr.size)
操作,或者O(arr.size+n*log(n))
如果您需要按排序顺序排列的元素。
numpy.partition(arr,
n)返回一个数组的大小arr
,其中n
第i个元素是这将是什么,如果该阵列被分选。所有较小的元素都在该元素之前,而所有较大的元素都在之后。
numpy.argpartition
是numpy.partition
为numpy.argsort
是numpy.sort
。
这是使用这些函数查找n
二维最小元素的索引的方式arr
:
flat_indices = numpy.argpartition(arr.ravel(), n-1)[:n]row_indices, col_indices = numpy.unravel_index(flat_indices, arr.shape)
而且,如果您需要按顺序排列索引,那么row_indices[0]
最小元素的行而不是最小元素之一也将是n
:
min_elements = arr[row_indices, col_indices]min_elements_order = numpy.argsort(min_elements)
row_indices, col_indices = row_indices[min_elements_order], col_indices[min_elements_order]
一维的情况要简单得多:
# Unordered:indices = numpy.argpartition(arr, n-1)[:n]
# Extra code if you need the indices in order:
min_elements = arr[indices]
min_elements_order = numpy.argsort(min_elements)
ordered_indices = indices[min_elements_order]
以上是 使用NumPy从矩阵获取最小/最大n值和索引的有效方法 的全部内容, 来源链接: utcz.com/qa/398575.html