我正在尝试将字典转换为可以使用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数组使我难以理解。
感谢您的帮助
答案 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]]
旧答案:
此答案有很多假设,主要是因为问题中没有足够的信息。但是,假设
可以通过列表理解和重新设置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
对应于列。如果您希望使用更地理的约定,请在最终列表理解中交换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