使用 numpy.where() 在给定范围内的两个数组中搜索元素

Posted

技术标签:

【中文标题】使用 numpy.where() 在给定范围内的两个数组中搜索元素【英文标题】:Search elements in two arrays in the given range using numpy.where() 【发布时间】:2016-11-17 13:55:49 【问题描述】:

我正在处理大量的地球物理数据。我有两个大小为 320x340 的 numpy 数组:第一个 XLAT 包含网格中每个点的纬度,第二个 XLON 包含网格中每个点的经度。所以每个i, j 用纬度XLAT[i][j] 和经度XLON[i][j] 描述地面上的点。

我有坐标P_LATP_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] &lt;= ST_LON &lt;= XLON[i][j+1]XLAT[i][j] &lt;= ST_LAT &lt;= XLAT[i+1][j]

这应该很快就能奏效吗?

【问题讨论】:

你的意思是 XLON[i][j] 而不是 XLON[i] 在你的条件下? 你设定了两个目标。 1:找到最近的4个点。 2:找到满足条件的项目。你想要哪个? XLON 和 XLAT 的尺寸均为 320x340。条件是找到最近的 4 个点,我在给定的条件下尝试了它。 您还没有回答第一个问题。我们对 XLON 和 XLAT 数据了解多少?例如。 XLON[i][j] 【参考方案1】:

我不确定编程任务,所以让我用我自己的话重复一遍:

您有两个 2dim 数组 XLAT 和 XLON。它们是某种平移数组,用于从某个网格中获取纬度/经度。

从您的代码示例中,我得出结论: XLON[i][j]==XLON[h][j] 对范围 (0,lat) 内的所有 i,h 都有效 ?! (也许有一个很好的理由拥有那个对象,但它看起来不是很好)

所以最简单的解决方案应该是单独处理机器人尺寸:

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 尺寸。

【讨论】:

【参考方案2】:

感谢所有回复,我找到了一个使用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)

【讨论】:

以上是关于使用 numpy.where() 在给定范围内的两个数组中搜索元素的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA 在给定范围的情况下使用表格内的单元格

查找给定日期范围内的工作日/周末数

给定'getrand100()'函数获取特定范围内的随机数

生成长度在给定范围内的数组的所有可能组合

如何使用 nmap 确定给定范围内的哪些 IP 具有端口 80?

Java - 打印给定范围内的随机 IP 地址