首页 > 解决方案 > 如何将具有坐标和频率的字典转换为矩阵?

问题描述

我有一本看起来像这样的字典:

data = {(-1.0, 4.0): 1, (2.0, 2.0): 12, (3.0, 1.0): 8}

我想制作一个看起来像这样的矩阵:

[[0. 0. 0. 0. 0.]
 [1. 0. 0. 0. 0.]
 [0. 0. 0. 12. 0.]
 [0. 0. 0. 0. 8.]
 [0. 0. 0. 0. 0.]]

其中字典中的每个键都是我的矩阵中的“坐标”(从左下角开始),轴的限制由我定义 (xlim: -3, 13, ylim: -6, 8) not shown

我试图通过这样做来尝试:

matrix = np.zeros((5,5))
for (x, y), z in data.items():
    x = int(x)
    y = int(y)

    matrix[y,x] = z

但是我收到了负尺寸的错误。

我的最终目标是将我的字典绘制为某种直方图,其中坐标是 x,y,字典值(频率)是我的 z 维度或“深度”。

标签: pythonpandasnumpydictionaryplot

解决方案


与已经建议的类似,将矩阵“移动”到正区域,然后使用 x 和 y 偏移定位坐标:

import numpy as np
data = {(-1.0, 4.0): 1, (2.0, 2.0): 12, (3.0, 1.0): 8}
x_offset = 3
y_offset = 6
mat = np.zeros((17, 15))
for (x, y), z in data.items():
    mat[int(y + y_offset), int(x + x_offset)] = z

编辑

好的,我认为这就是您的想法(我假设 x 和 y 坐标中都存在负值):

如果要硬编码 x 和 y 值的范围(xlim:-3、13,ylim:-6、8):

x_min, x_max = -3, 13
y_min, y_max = -6, 8

或者从数据中确定它们:

x_min = min([x for (x, y), z in data.items()])
y_min = min([y for (x, y), z in data.items()])
x_max = max([x for (x, y), z in data.items()])
y_max = max([y for (x, y), z in data.items()])

然后使用:

x_offset = abs(x_min)
y_offset = abs(y_min)

mat = np.zeros((y_max + y_offset + 1, x_max + x_offset + 1))    # (Row, column) becomes (y, x)

for (x, y), z in data.items():
    print(x, y)
    mat[int(y + y_offset), int(x + x_offset)] = z

pd.DataFrame(mat, columns=range(x_min, x_max + 1), 
                  index=range(y_min, y_max + 1))

然后使用:

plt.imshow(mat, origin='lower', extent=[x_min, x_max + 1, 
                                        y_min, y_max + 1])

推荐阅读