存储类似网格的数据并执行查找

时间:2018-10-31 14:43:46

标签: python numpy

我有一个二维网格(示例如下所示),希望能更好地理解...

  1. 存储此类数据的最“ pythonic”方式
  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数组是一种很好的潜在解决方案。任何/所有建议都将不胜感激-请让我知道是否可以提供更多详细信息。只是想开始使用一种有效的方法。谢谢!

2 个答案:

答案 0 :(得分:1)

最简单的方法-使其嵌套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)]

答案 1 :(得分:1)

我建议使用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