在python中获取具有最高和最低x和y值的点

2024-04-30 01:41:06 发布

您现在位置:Python中文网/ 问答频道 /正文

这似乎很简单,但我希望尽可能高效地完成这项工作

实际上,我对最高点、最低点、最右点和最左点感兴趣

给定一个类似[[10,2],[0,2],[1,10],[1,0],[2,3],[5,2],[7,2],[7,3],[3,8],[6,1]]的数组

我已经这样做了

max_x = max([p[0] for p in pts])
min_x = min([p[0] for p in pts])
max_y = max([p[1] for p in pts])
min_y = min([p[1] for p in pts])

但是我不只是需要max_x值。我需要完整的点,我不希望在列表中重复超过需要的部分(为了大输入的速度)

如果是N维点(每个维度中的最高点和最低点),则可获得额外积分


Tags: in列表for数组min速度max感兴趣
3条回答

Numpy就是为这种问题而设计的。它是多维数值数组(规则形状的嵌套列表)的性能实现:

import numpy as np

pts = [[10,2],[0,2],[1,10],[1,0],[2,3],[5,2],[7,2],[7,3],[3,8],[6,1]]
arr = np.array(pts)
max_idx = np.argmax(arr, axis=0)
min_idx = np.argmin(arr, axis=0)
max_x, max_y = arr[max_idx]
min_x, min_y = arr[min_idx]

输出:

# max_x, max_y, min_x, min_y
array([10,  2])
array([ 1, 10])
array([0, 2])
array([1, 0])

针对大型网络的列表与阵列的性能比较

from random import random
N = int(1e7) # 10m points

def list_version(N):
    pts = [[random(), random()] for j in range(N)]
    max_x = max(pts, key = lambda x: x[0])
    max_y = max(pts, key = lambda x: x[1])
    min_x = min(pts, key = lambda x: x[0])
    min_y = min(pts, key = lambda x: x[1])
    return max_x, min_x, max_y, min_y

def arr_version(N):
    arr = np.random.random(size=(N,2))
    max_idx = np.argmax(arr, axis=0)
    min_idx = np.argmin(arr, axis=0)
    max_x, max_y = arr[max_idx]
    min_x, min_y = arr[min_idx]
    return max_x, min_x, max_y, min_y

%timeit list_version(N)
4.62 s ± 25.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit arr_version(N)
269 ms ± 2.28 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

使用key参数,以便在只比较一项时返回整点

from operator import itemgetter

max_x = max(p, key=itemgetter(0))
min_x = min(p, key=itemgetter(0))

max_y = max(p, key=itemgetter(1))
min_y = min(p, key=itemgetter(1))

您也可以使用单个循环来完成此操作,而不是调用min()max()

min_x = max_x = min_y = max_y = p[0]

for point in p[1:]:
    if point[0] < min_x[0]:
        min_x = point
    if point[0] > max_x[0]:
        max_x = point
    if point[1] < min_y[1]:
        min_y = point
    if point[1] > max_y[1]:
        max_y = point

maxmin采用key参数,在该参数中可以指定用于比较的值

使用:

max_x = max(pts, key = lambda x: x[0])
min_x = min(pts, key = lambda x: x[0])
max_y = max(pts, key = lambda x: x[1])
min_y = min(pts, key = lambda x: x[1])

输出:

>>> print(max_x, min_x, max_y, min_y)
[10, 2] [0, 2] [1, 10] [1, 0]

相关问题 更多 >