将元组(x,y):value的字典转换为x [],y [],value [] [],其中索引对应?

时间:2019-02-08 11:03:52

标签: python arrays numpy dictionary

我正在尝试将字典转换为可以使用matplotlib绘制为轮廓的形式。字典的键是X,Y坐标的元组,值是该坐标的读数。我想将它们放入三个numpy数组,x坐标的1D数组,y坐标的1D数组和值的2D数组。 x,y数组的各个索引应对应于字典中定义的2D数组中的值的索引。

进行修改以更好地定义问题:

示例输入数据: 字典

(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数组,但是values数组使我难以理解。

感谢您的帮助

3 个答案:

答案 0 :(得分:1)

您可以简单地遍历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))

答案 1 :(得分:0)

在这里,我的意思是“自包含”,即首先生成一些输入数据,然后将它们转换为字典,然后再返回原始数组。途中,我添加了一些随机噪声以使x和y值彼此接近,但仍使其唯一。在this answer之后,可以通过先对这些值进行四舍五入然后使用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值是完整的

可以通过列表理解和重新设置numpy ndarray来解决这个问题:

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值不一定按照所发布示例数据所建议的顺序,则仍然可以通过一些巧妙的排序来解决该问题。

答案 2 :(得分:0)

在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对应于列。如果您希望使用更地理的约定,请在最终列表理解中交换xy

作为脚本,我们可以编写

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