Я создал словарь изображения с объектами, имеющими правильные координаты x и y. Однако этот словарь линейный. Скажем, для изображения 465x1000 он идет до ключей 464999 (начальный индекс 0). Итак, текущий доступ, скажем, по ключу 197376, осуществляется следующим образом

for keys, values in Grids.items():
    print(keys)
    print(values)

И вывод

197376
x: 394 
y: 376

Первые значения - это ключ и X: [значение] и Y: [Значение] - это строковое представление объектов.

Как я могу обратиться к этому уплощенному словарю объектов (которые имеют эти координаты x и y) в виде матрицы?

Есть ли способ преобразовать его в формат, чтобы он мог быть адресован как обычный список списков

Grids[394][376]

Который дает объект в указанной координате.

Любая другая логика / вариации также приветствуются, которые достигают этой цели.

1
elixir 14 Мар 2018 в 20:59

1 ответ

Лучший ответ

Вы можете реконструировать индекс по координатам пикселей. Упрощение:

width = 10  # max in x
height= 5   # max in y

# create linear dict with demodata list of the coords, your value would be your data object
dic = { a+b*width:[a,b] for a in range(width) for b in range(height)}

# control
print(dic)

# calculate the linear indes into dict by a given tuple of coords and the dict with data
def getValue(tup,d):
    idx = tup[0]+tup[1]*width
    return d[idx]

print(getValue((8,2),dic))       # something in between
print(getValue((0,0),dic))       # 0,0 based coords. 
print(getValue((10-1,5-1),dic))  # highest coord for my example

Выход:

{0: [0, 0], 1: [1, 0], 2: [2, 0], 3: [3, 0], 4: [4, 0], 5: [5, 0], 
 6: [6, 0], 7: [7, 0], 8: [8, 0], 9: [9, 0], 10: [0, 1], 11: [1, 1], 
12: [2, 1], 13: [3, 1], 14: [4, 1], 15: [5, 1], 16: [6, 1], 17: [7, 1], 
18: [8, 1], 19: [9, 1], 20: [0, 2], 21: [1, 2], 22: [2, 2], 23: [3, 2], 
24: [4, 2], 25: [5, 2], 26: [6, 2], 27: [7, 2], 28: [8, 2], 29: [9, 2], 
30: [0, 3], 31: [1, 3], 32: [2, 3], 33: [3, 3], 34: [4, 3], 35: [5, 3], 
36: [6, 3], 37: [7, 3], 38: [8, 3], 39: [9, 3], 40: [0, 4], 41: [1, 4], 
42: [2, 4], 43: [3, 4], 44: [4, 4], 45: [5, 4], 46: [6, 4], 47: [7, 4], 
48: [8, 4], 49: [9, 4]}

[8, 2] 
[0, 0]
[9, 4]

Хотя использование массива pandas или numpy в первую очередь, вероятно, было бы разумнее: o) У меня нет большого опыта с ними. Вычисление линейного индекса - это арахисовое вычисление, так что вы также можете упростить его.

1
Patrick Artner 14 Мар 2018 в 21:33