在二维数组中查找 n 个 argmins

Posted

技术标签:

【中文标题】在二维数组中查找 n 个 argmins【英文标题】:Find n argmins in 2d array 【发布时间】:2021-12-20 18:53:08 【问题描述】:

我需要在 python 的二维数组中找到 n 个 argmins,我该怎么做?

示例:

a=np.array([[1, 5, 9], [2, 3, 10], [4, 11, 12]])
argmins = n_argmins(a, 5) # finding 5 argmins
print(argmins)

输出:

[[0 1]
 [0 2]
 [1 0]
 [1 1]
 [2 0]]

【问题讨论】:

结果不应该是这样吗? [[0, 0] [1, 0] [1, 1] [2, 0] [0, 1]] 您可以从argsorta.ravel() 开始 【参考方案1】:

您可以尝试以下方法:

import numpy as np

a=np.array([[1, 5, 9], [2, 3, 10], [4, 11, 12]])
np.c_[np.unravel_index(a.ravel().argsort()[:5], a.shape)]

它给出:

array([[0, 0],
       [1, 0],
       [1, 1],
       [2, 0],
       [0, 1]])

【讨论】:

【参考方案2】:

将数据转换为列表,但请记住原始索引。 在列表中搜索 n min args。

代码:

def n_argmins(a, n)
  for i,inner in enumerate(a):
     for j,x in enumerate(inner):
         indexes[x] = [i,j]
         a_new.append(x)
  res = []
  for _ in range(n):
     res.append(indexes[min(a_new)])
     a_new.remove(min(a_new))
  return res

假设所有列表都已排序(如示例所示),我们可以以更好的方式解决它。该解决方案基于每个内部列表中的第一个值已经是该列表的最小参数的想法。所以我们只需要搜索它们。代码:

n = 5
next_possible_mins = [0]*len(a)
indexes = [0]*len(a)
result = []
for i in range(len(a)):
    next_possible_mins[i] = a[i][0]
    indexes[i] = [0, i]

for i in range(n):
    index_min = next_possible_mins.index(min(next_possible_mins))
    result.append(indexes[index_min])
    indexes[index_min] = [indexes[index_min][0]+1, indexes[index_min][1]]
    next_possible_mins[index_min] = a[indexes[index_min][1]][indexes[index_min][0]]

print(result)

【讨论】:

以上是关于在二维数组中查找 n 个 argmins的主要内容,如果未能解决你的问题,请参考以下文章

查找对应于另一个数组中沿轴的最小值的数组

二维数组中的查找

LEETCODE刷题 二维数组查找

求问一道c语言编程题,在二维数组中进行查找 输出下标

递归分治算法之二维数组二分查找(Java版本)

1.二维数组的查找