我有一个800乘800的阵列。它是一个二维数组,但它映射了一个等高线图,这意味着数组中的每个位置代表一个2d地图上的位置,该点的值是地图上显示的值。
例如,点[200, 343]
的值-1.2
表示200
的X位置,343
的Y位置,该点将等于{{1} }}
我的问题是,如果我想从这里创建N个最低值的一维数组,我该怎么做呢?
我尝试过排序和拼接,但是当我尝试排序时,它只按行或列排序,但我试图从整个数组中取N个最低值而不管值的位置。
答案 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]