【问题标题】:Finding list of highest elements in 2D array: Python 3查找二维数组中最高元素的列表:Python 3
【发布时间】:2018-12-09 20:23:00
【问题描述】:

我有一个像这样大小(640X480)的二维数组:

[[1.2 , 9.5 , 4.8 , 1.7],
 [5.5 , 8.1 , 7.6 , 7.1],
 [1.4 , 6.9 , 7.8 , 2.2]]     (this is a sample of a 4X3 array)

我必须以最快的方式找到数组中前 100(或 N)个最高值;所以我需要最优化、处理时间最短的代码。

由于它是一个巨大的数组,如果我只检查每个第二个元素或每个第三个或第四个元素就可以了。

算法的输出应该是一个元组列表,每个元组是高价值元素的二维索引。

例如,9.5 的索引是 (0,1)

我找到了解决办法,但是太慢了:

indexes=[]
for i in range(100):
    highest=-1
    highindex=0.1
    for indi,i in enumerate(array):
        for indj,j in enumerate(i):
            if j>highest and not((indi,indj) in indexes):
                highest= j
                highindex=(indi,indj)
    indexes.append(highindex)

【问题讨论】:

  • 我已经找到了一种方法来做到这一点,但它需要太多时间,最好的方法是什么?
  • 请分享花费太多时间代码。
  • 好的,我已经分享了耗时算法。

标签: python arrays numpy search optimization


【解决方案1】:

这是我想到的解决方案,希望它的速度足以满足您的需求。

num_list = [
    [1.2, 9.5, 4.8, 1.7],
    [5.5, 8.1, 7.6, 7.1],
    [5.5, 9.6, 7.6, 7.1],
    [5.5, 8.1, 4.5, 7.1],
    [1.4, 6.9, 7.8, 12.2]
]

needed_highest = 5 # This is where your 100 would go
highest = [-1] * needed_highest
result = [-1] * needed_highest

for y in range(0, len(num_list)):
    for x in range(0, len(num_list[y])):
        num = num_list[y][x]
        min_index = highest.index(min(highest))
        min_value = highest[min_index]
        if min_value < num:
            highest[min_index] = num
            result[min_index] = (x, y)
print(result)

结果没有以任何方式排序,但如果需要,实现它应该不难。

【讨论】:

  • 感谢您的回答。
  • 别担心,希望对您有所帮助
【解决方案2】:

numpy.argpartitionnumpy.unravel_indexnumpy.column_stack 例程:

测试 ndarray arr 是一个改组数组,其值 099 形状为 (11, 9)
假设我们要查找前 7 个最大值的 2d 索引列表:

In [1018]: arr
Out[1018]: 
array([[36, 37, 38, 39, 40, 41, 42, 43, 44],
       [27, 28, 29, 30, 31, 32, 33, 34, 35],
       [72, 73, 74, 75, 76, 77, 78, 79, 80],
       [ 0,  1,  2,  3,  4,  5,  6,  7,  8],
       [18, 19, 20, 21, 22, 23, 24, 25, 26],
       [45, 46, 47, 48, 49, 50, 51, 52, 53],
       [ 9, 10, 11, 12, 13, 14, 15, 16, 17],
       [90, 91, 92, 93, 94, 95, 96, 97, 98],
       [54, 55, 56, 57, 58, 59, 60, 61, 62],
       [63, 64, 65, 66, 67, 68, 69, 70, 71],
       [81, 82, 83, 84, 85, 86, 87, 88, 89]])

In [1019]: top_N = 7

In [1020]: idx = np.argpartition(arr, arr.size - top_N, axis=None)[-top_N:]

In [1021]: result = np.column_stack(np.unravel_index(idx, arr.shape))

In [1022]: result
Out[1022]: 
array([[7, 2],
       [7, 3],
       [7, 4],
       [7, 5],
       [7, 7],
       [7, 8],
       [7, 6]])

【讨论】:

  • 我得到一个错误:ValueError: kth(=-98) out of bounds (1)
  • arr.size - top_N 得到什么?
  • @VikhyatAgarwal,您当前的代码是什么?请注意,在进行此类分区时top_N 不应大于初始数组的列数
  • 你现在的arr.shapearr.ndim是什么?
  • @VikhyatAgarwal,这就是答案:您正在测试未初始化的数组或空数组。检查你的数组初始化/填充代码
猜你喜欢
  • 2017-04-11
  • 1970-01-01
  • 2020-10-03
  • 1970-01-01
  • 2018-05-24
  • 2021-02-03
  • 2021-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多