存储网格数据并执行查找

2024-04-28 10:45:33 发布

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

我有一个二维网格(下面的例子可视化),希望能更好地理解

  1. 存储此类数据的最“python”方式
  2. 如何在给定坐标中用小数执行查找-即“层”,其中层<;=价值<;下一层

查找示例:

  • x=1.35和y=58.00将返回“F”
  • x=2.00和y=24.99将返回“C”
  • x=2.00和y=25.00将返回“G”

enter image description here
最初马虎的想法是:

lookupData = {
    0 : { 0: "A", 1: "B", 2: "C", 3: "D" },
    25 : { 0: "E", 1: "F", 2: "G", 3: "H"},
    ...
}

一些google也指出numpy阵列是一个很好的潜在解决方案。任何/所有的建议都是非常感谢-请让我知道如果可以提供更多的细节。只是想从一个有效的方法开始。谢谢


Tags: 数据ltnumpy网格示例可视化google方式
2条回答

最简单的方法-使其成为嵌套的list,并使用一些简单的算术/类型转换进行查找:

values = [['A', 'B', 'C', 'D'], ['E', 'F', 'G', 'H']]

lookup = lambda grid, x, y: grid[int(y) // 25][int(x)]

lookup(values, 2.3, 24.99)
# 'C'
lookup(values, 2.5, 25.00)
# 'G'

如果y轴标记以不规则排序列表的形式给出,则可以使用bisect在对数时间内找到正确的索引:

from bisect import bisect

y_axis = [0, 25, 75, 190, 225]

lookup = lambda grid, x, y: grid[bisect(y_axis, y) - 1][int(x)]

我建议使用pandas-它非常适合您的任务:

import pandas as pd

df = pd.DataFrame({
    0: {0: "A", 1: "B", 2: "C", 3: "D"},
    25: {0: "E", 1: "F", 2: "G", 3: "H"},
    60: {0: "I", 1: "J", 2: "K", 3: "L"},
    90: {0: "M", 1: "N", 2: "O", 3: "P"}})

df = df.T
print(df)
print()

for x, y in [(1.35, 58), (2, 24.99), (2, 25)]:
    idx = df.index.searchsorted(y, side='right')
    col = df.columns.searchsorted(x, side='right')
    print(df.iloc[idx - 1, col - 1])

输出:

    0  1  2  3
0   A  B  C  D
25  E  F  G  H
60  I  J  K  L
90  M  N  O  P

F
C
G

相关问题 更多 >