Преобразовать словарь кортежей (x, y): значение в x [], y [], значение [] [], где индексы соответствуют? - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь преобразовать словарь в форму, которую можно построить в виде контура с помощью matplotlib.Ключи к словарю - это кортеж координат X, Y, а значение - это чтение по этой координате.Я хотел бы поместить их в массив с тремя числами, одномерный массив координат x, одномерный массив координат y и двумерный массив значений.Соответствующие индексы массивов x, y должны соответствовать индексу значения в двумерном массиве, определенном в словаре.

Правка для лучшего определения вопроса:

Пример входных данных:Словарь

(0,0): 1
(1.5,0): 2
(0,1.5): 3
(1.5,1.5): 4

Что бы я хотел

x = [0,1.5]
y = [0,1.5]
values = [[1,2],[3,4]]

У меня есть

for key in corr_data.items():
    X.append(key[0])
    Y.append(key[1])
X = list(dict.fromkeys(X))
Y = list(dict.fromkeys(Y))

, который получает массивы x и y, но массив значений ускользает от меня.

Любая помощь приветствуется

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019

Я здесь «самодостаточный» ответ в том смысле, что сначала я генерирую некоторые входные данные, которые затем преобразую в словарь, а затем возвращаю в исходные массивы.По пути я добавляю немного случайного шума, чтобы значения x и y были близки друг к другу, но при этом делали их уникальными.После этого ответа список всех значений, которые «близки» друг к другу, можно найти, сначала округлив значения, а затем используя np.unique.

mport numpy as np

##generating some input data:
print('input arrays')
xvals = np.linspace(1,10, 5)
print(xvals)
yvals = np.linspace(0.1, 0.4, 4)
print(yvals)
xvals, yvals = np.meshgrid(xvals, yvals)

##adding some noise to make it more interesting:
xvals += np.random.rand(*xvals.shape)*1e-3
yvals += np.random.rand(*yvals.shape)*1e-5

zvals = np.arange(xvals.size).reshape(*xvals.shape)
print(zvals)

input_dict ={
    (i,j): k for i,j,k in zip(
        list(xvals.flatten()), list(yvals.flatten()), list(zvals.flatten())
    )
}

##print(input_dict)


x,y,z = map(np.array,zip(*((x,y,z) for (x,y),z in input_dict.items())))

##this part will need some tweaking depending on the size of your
##x and y values
xlen = len(np.unique(x.round(decimals=2)))
ylen = len(np.unique(y.round(decimals=3)))


x = x.round(decimals=2).reshape(ylen,xlen)[0,:]
y = y.round(decimals=3).reshape(ylen,xlen)[:,0]
z = z.reshape(ylen,xlen)

print('\n', 'output arrays')

print(x)
print(y)
print(z)

Вывод выглядитнапример:

input arrays
[ 1.    3.25  5.5   7.75 10.  ]
[0.1 0.2 0.3 0.4]
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]]

 output arrays
[ 1.    3.25  5.5   7.75 10.  ]
[0.1 0.2 0.3 0.4]
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]]

Старый ответ:

В этом ответе много предположений, в основном потому, что в вопросе недостаточно информации.Но, предполагая, что

  1. значения x и y упорядочены так же хорошо, как в данных примера
  2. значения x и y завершены

Oneможет решить проблему с пониманием списка и изменением формы nndy ndarrays:

import numpy as np

input_dict = {
    (0,0): 1,
    (1,0): 2,
    (0,1): 3,
    (1,1): 4,
}

x,y,z = map(np.array,zip(*((x,y,z) for (x,y),z in input_dict.items())))

xlen = len(set(x))
ylen = len(set(y))

x = x.reshape(xlen,ylen)[0,:]
y = y.reshape(xlen,ylen)[:,0]
z = z.reshape(xlen,ylen)


print(x)
print(y)
print(z)

, что дает

[0 1]
[0 1]
[[1 2]
 [3 4]]

, надеюсь, это поможет.

PS: ЕслиЗначения x и y не обязательно находятся в порядке, предложенном опубликованными примерами данных, проблему можно решить с помощью некоторой умной сортировки.

0 голосов
/ 08 февраля 2019

В REPL

In [9]: d = {(0,0): 1, (1,0): 2, (0,1): 3, (1,1): 4}
In [10]: x = set(); y = set()
In [11]: for xx, yy in d.keys():
    ...:     x.add(xx)
    ...:     y.add(yy)
In [12]: x
Out[12]: {0, 1}
In [13]: x = sorted(x) ; y = sorted(y)
In [14]: x
Out[14]: [0, 1]
In [15]: v = [[d.get((xx,yy)) for yy in y] for xx in x]
In [16]: v
Out[16]: [[1, 3], [2, 4]]

Как видите, мой результат отличается от вашего примера, но обычно x соответствует строкам, а y соответствует столбцам.Если вы хотите более географическое соглашение, поменяйте местами x и y в окончательном понимании списка.

В качестве сценария мы можем написать

def extract{d}:
    x = set(); y = set()
    for xx, yy in d.keys():
        x.add(xx)
        y.add(yy)
    x = sorted(x) ; y = sorted(y)
    v = [[d.get((xx,yy)) for yy in y] for xx in x]
    # = [[d.get((xx,yy)) for xx in x] for yy in y]
    return x, y, v
0 голосов
/ 08 февраля 2019

Вы можете просто перебрать свой dict и создать свои списки и, возможно, преобразовать эти списки в numpy.ndarray

x = []
y = []
vals = np.zeros(your_grid_shape)
for ((i,j), v) in your_dict.iteritems():
    x.append(i)
    y.append(j)
    vals[i, j] = v
x = list(set(x))
y = list(set(y))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...