[英]Search elements in two arrays in the given range using numpy.where()
我正在处理大量的地球物理数据。 我有两个大小为320x340的numpy数组:第一个XLAT
包含网格中每个点的纬度,第二个XLON
包含网格中每个点的经度。 所以每个i, j
用纬度XLAT[i][j]
和经度XLON[i][j]
描述地面上的点。
我有坐标P_LAT
和P_LON
,我必须找到最接近给定点的4点。
首先,我编写了简单的函数,它贯穿x轴和y轴上的所有点,但它使得320 * 340 = 108 800次迭代并且工作非常慢(每点约0.5秒):
for i in range(0, lat-1):
for j in range(0, lon-1):
if ST_LON >= XLON[i][j] and \
ST_LON < XLON[i][j + 1] and \
ST_LAT >= XLAT[i][j] and \
ST_LAT < XLAT[i + 1][j]:
return (True, i, i + 1, j, j + 1)
然后我找到了一些关于numpy.where()
并编写了这段代码:
for i in range(0, lat):
rows = numpy.where((XLON[i] >= ST_LON - 0.5) & (XLON[i] <= ST_LON + 0.5))
for j in rows[0]:
if ST_LON >= XLON[i][j] and \
ST_LON < XLON[i][j + 1] and \
ST_LAT >= XLAT[i][j] and \
ST_LAT < XLAT[i + 1][j]:
return (True, i, i + 1, j, j + 1)
这个功能工作得更快(每点约0.015秒),但我认为这不是正确而美观的解决方案。
所以我的最后一个问题是如何在两个数组中找到满足条件的项:
XLON[i] <= ST_LON <= XLON[i][j+1]
和XLAT[i][j] <= ST_LAT <= XLAT[i+1][j]
这应该很快?
我不确定编程任务,所以让我用自己的话重复一遍:
你有两个2dim阵列XLAT和XLON。 它们是某种平移阵列,用于从某个网格获取纬度/经度。
从你的代码示例中我得出结论: XLON [i] [j] == XLON [h] [j]对所有i,h在范围(0,lat)中有效吗? (也许有一个很好的理由拥有那个对象,但它看起来并不高效)
因此,最简单的解决方案应该是单独处理机器人尺寸:
for i in range(0, lat-1):
if (XLON[i][0] >= ST_LON - 0.5) & (XLON[i][0] <= ST_LON + 0.5):
break
for j in range(0, lon-1):
if (XLAT[0][j] >= ST_LAT - 0.5) & (XLAT[0][j] <= ST_LAT + 0.5)):
break
return (True, i, i + 1, j, j + 1)
您还可以使用np.where替换if-break语句。
我不确定我是否帮助你。 如果我的回答没有帮助,那么向我们提供一个带有XLON的小型工作示例python代码是非常有用的,XLAT简化为5x4维度。
感谢所有的回复,我找到了一个快速的解决方案,使用numpy.where()
条件numpy.where()
,但它有点不漂亮,不美观:)
#Calculate the step
dLAT = numpy.abs(self.XLON[0][1] - self.XLON[0][0]) * 3
dLON = numpy.abs(self.XLAT[1][0] - self.XLAT[0][0]) * 3
#Get the rows and cells satisfying the condition
rows, cells = numpy.where(((self.XLON >= ST_LON - dLON) & (self.XLON <= ST_LON + dLON)) & ((self.XLAT >= ST_LAT - dLAT) & (self.XLAT <= ST_LAT + dLAT)))
#Loop through all the values
for i in range(0, len(rows)):
#Get the indexes
current_lat = rows[i]
next_lat = rows[i] + 1
current_lon = cells[i]
next_lon = cells[i] + 1
#Check the point
if ST_LON >= self.XLON[current_lat][current_lon] and ST_LON < self.XLON[current_lat][next_lon] and \
ST_LAT >= self.XLAT[current_lat][current_lon] and ST_LAT < self.XLAT[next_lat][current_lon]:
return(True, current_lat, next_lat, current_lon, next_lon)
return (False, 0, 0, 0, 0)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.