从2D阵列中选择N个最低值

时间:2017-06-01 14:55:07

标签: python arrays sorting

我有一个800乘800的阵列。它是一个二维数组,但它映射了一个等高线图,这意味着数组中的每个位置代表一个2d地图上的位置,该点的值是地图上显示的值。 例如,点[200, 343]的值-1.2表示200的X位置,343的Y位置,该点将等于{{1} }}

我的问题是,如果我想从这里创建N个最低值的一维数组,我该怎么做呢?

我尝试过排序和拼接,但是当我尝试排序时,它只按行或列排序,但我试图从整个数组中取N个最低值而不管值的位置。

3 个答案:

答案 0 :(得分:1)

以下是一种方法,我使用函数point模拟getValue处的值:

>>> import random
>>> from heapq import nsmallest
>>> 
>>> data = [(2,3), (3,5), (5,6), (6,7), (7,8), (8, 9), (9,10)]
>>> 
>>> sample = {}
>>> # Get random points value from points and store in sample to test later
>>> def getValue(x, y):
...     sample[(x, y)] = random.randint(1, 10)
...     return sample[(x, y)]
...
>>> # Get n=3 smallest points
>>> result = heapq.nsmallest(3, data, key=lambda z: getValue(z[0], z[1]))
>>>
>>> # See the Sample for expected output manually
>>> sample
{(8, 9): 8, (9, 10): 10, (6, 7): 10, (5, 6): 3, (2, 3): 8, (7, 8): 10, (3, 5): 1}
>>> # 3 smallest points
>>> result
[(3, 5), (5, 6), (2, 3)]
>>>

答案 1 :(得分:0)

import numpy as np
arr = np.random.random((800, 800))
N = 10

# small N elements of array
small_elems = sorted(arr.ravel())[:N]

print(small_elems)

其中.ravel()展平数组,sorted()对其进行排序,返回排序结果,[:N]检索前N个元素。

诀窍是在排序和切片之前弄平数组。

答案 2 :(得分:0)

如果我理解正确,你想从N×M矩阵中取出S个最小的数字。您可以将此矩阵分解为单个数组,方法是将每个数组附加到前一个数组的末尾,然后对结果进行排序。

matrix = [[3, 2, 1], [6, 5, 4], [1, 3, 5]]
array = []

for e in matrix:
    array += e

assert sorted(array) == [1, 1, 2, 3, 3, 4, 5, 5, 6]
相关问题