在长向量中高效获取最小值索引,Python

9 投票
6 回答
4543 浏览
提问于 2025-04-16 17:52

我有一长串经度值(长度为420481),还有一串纬度值。我想找到与最小经度对应的纬度。

我试过这样做:

SE_Lat = [Lat[x] for x,y in enumerate(Lon) if y == min(Lon)]

但是这个方法花了很长时间才完成。

有没有人知道更有效的方法?

也许你们还有其他建议: 我现在想找到一个新的经度对应的最近的纬度,这个新经度不在原来的经度列表里。我试过这样:

minDiff = [min(abs(x - lon_new) for x in lons)] # not very quick, but works
[(lat,lon) for lat,lon in izip(lats,lons) if abs(lon-lon_new)==minDiff]

最后一行报错了,因为有多个匹配的结果。我现在不知道怎么只找到一个值,比如说第一个。任何帮助都非常感谢!

6 个回答

4

在直接讨论解决这个问题的各种方法之前,我们先来看看原始代码为什么这么慢。

SE_Lat = [Lat[x] for x,y in enumerate(Lon) if y == min(Lon)]

根据提问者提供的信息,我们知道 len(Lon) == 420481。找到最小值的操作是 O(N),意思是你得至少看一遍每个值。在列表推导式中,条件在每次循环时都会重新计算。上面的代码在每次循环中都重新计算最小值,这样就把原本应该是 O(N) 的操作变成了 O(N^2),在这个例子中,竟然要进行 177 十亿 次迭代。

如果我们把 min(Lon) 的结果存储在一个局部变量中,然后在循环条件中使用这个变量,而不是每次都重新计算,运行时间就会降到一个可以接受的水平。

不过,如果是我来做(假设我之后还需要所有的纬度、经度和索引),我会这样处理:

min_longitude, min_index = min(longitude, index for index, longitude in enumerate(Lon))
min_latitude = Lat[min_index]

当然,还有很多其他的选择,哪种方法最好会根据具体的使用情况而有所不同。

6

在编程中,有时候我们需要让程序在特定的条件下执行某些操作。这就像给程序设定了一些规则,只有当这些规则被满足时,程序才会继续进行。比如说,你可能希望程序在用户输入正确的密码后才能打开某个文件,这就是一个条件判断的例子。

条件判断通常使用“如果”这个词来开始,比如“如果用户输入的密码是正确的,那么就打开文件”。在编程中,这种判断可以通过一些简单的语句来实现,帮助程序做出决策。

在代码中,我们可以看到一些特定的结构来实现这些条件判断。比如,使用“if”这个关键词来表示“如果”,然后跟上条件,最后是要执行的操作。这种方式让程序能够灵活应对不同的情况。

总之,条件判断就像是在给程序设定规则,让它在不同情况下做出不同的反应。这样可以让程序更加智能和实用。

min(itertools.izip(Lat, Lon), key=operator.itemgetter(1))[0]
7

我可以推荐使用numpy吗?

import numpy
nplats = numpy.array(lats)
nplons = numpy.array(lons)

# this part is 20x faster than using the built-in python functions
index = numpy.argmin(nplats)

print nplats[index], nplons[index]

这个方法比使用min(izip())的解决方案快很多(在我这边测试时,处理420481条随机生成的数据记录时快了大约20倍),不过当然你得把你的数据存储在numpy里,才能享受到这种速度提升。

撰写回答