当前位置: 首页 > 面试题库 >

使用NumPy从矩阵获取最小/最大n值和索引的有效方法

益清野
2023-03-14
问题内容

给定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]


 类似资料:
  • 这个问题可能是封闭的,因为它听起来很模糊,但我真的问这个,因为我不知道或者我的数学背景不够。 我试图实现一个挑战,其中一部分挑战要求我计算矩阵的最小值和最大值。我对矩阵的实现及其操作没有任何问题,但是什么是矩阵的最小值和最大值?考虑到3x3矩阵是9个数中最小的数,最大的是最大的还是其他什么?

  • 问题内容: 我有N维向量数组。 我正在使用sklearn的函数来计算距离值矩阵。注意,该矩阵关于对角线对称。 我需要与该矩阵中前N个值相对应的索引,因为这些索引将与成对索引相对应,它们代表了向量之间的最大距离。 我尝试做以获得每一行中最大值的索引,并获取每一列中最大值的索引,但是请注意: 和: 因为矩阵是关于对角线对称的,并且因为argmax返回它找到的具有最大值的第一个索引,所以我最终在行和列匹

  • 问题内容: NumPy提出了一种通过来获取数组最大值的索引的方法。 我想要类似的事情,但是返回N最大值的索引。 例如,如果我有一个数组,,将返回的索引相对应的元素。 问题答案: 我想出的最简单的方法是: 这涉及数组的完整排序。我想知道是否提供了一种进行部分排序的内置方法。到目前为止,我还没有找到一个。 如果此解决方案太慢(尤其是对于小型解决方案n),则可能值得考虑使用进行编码。

  • 我目前有以下问题,给定一个数组,为了简单起见,假设一个4 x 4数组(我实际上正在使用512 x 512) 我想在数组周围循环/滑动,这样我就可以在表单中保存新数组 < code>np.array([3,5],[7,6]),np.array([2,4],[8,8]),np.array([1,6],[2,1]),np.array ([7,7],[1,4])等等(理想情况下,我可以选择我的“滑动”窗口

  • 我实现了c程序,可以找到矩阵的元素:行的最大元素,同时列的最小元素,或行的-min元素,同时列的最大元素。例如,我们有数据。包含以下内容的txt文件: 4 7 8 9 10 6 5 4 11 5 0 1 12 4 2 7 13- 其中4是n-矩阵大小(4x4),7和10是这些数字。 下面是代码: 问题:我想知道我的代码是不是“脏”代码?因为我总是渴望让一切变得如此困难,只要有可能让它变得容易。是否