使用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.partitionnumpy.argpartition函数进行部分排序,使您可以及时执行此O(arr.size)操作,或者O(arr.size+n*log(n))如果您需要按排序顺序排列的元素。

numpy.partition(arr,

n)返回一个数组的大小arr,其中n第i个元素是这将是什么,如果该阵列被分选。所有较小的元素都在该元素之前,而所有较大的元素都在之后。

numpy.argpartitionnumpy.partitionnumpy.argsortnumpy.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

回到顶部