Хранение данных в виде сетки и выполнение поиска - PullRequest
0 голосов
/ 31 октября 2018

У меня есть двумерная сетка (пример представлен ниже), и я надеюсь лучше понять ...

  1. Самый «питонный» способ хранения таких данных
  2. Как выполнить поиск по заданным координатам с десятичными числами - то есть «уровень», где уровень <= значение <следующий уровень </li>

Примеры поиска:

  • 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"},
    ...
}

Некоторые Googling также указали, что numpy массивы являются хорошим потенциальным решением. Любой / все советы очень ценятся - пожалуйста, дайте мне знать, если можете предоставить более подробную информацию. Просто хочу начать, используя эффективный метод. Спасибо!

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Я бы рекомендовал использовать 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
0 голосов
/ 31 октября 2018

Самый простой подход - сделайте его вложенным 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)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...