python - 如何将具有坐标和频率的字典转换为矩阵?
问题描述
我有一本看起来像这样的字典:
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 维度或“深度”。
解决方案
与已经建议的类似,将矩阵“移动”到正区域,然后使用 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])
推荐阅读
- wordpress - 如何为 WordPress 中的所有 cookie 添加 sameSite=None 属性标头?
- javascript - 如何将多个值添加到本地存储中的键
- javascript - 格式化日期时不考虑时间的时刻本地化?
- php - 当正则表达式测试似乎工作时,预匹配为空
- reactjs - 如何在 ReactJS 中第二次单击时撤消 OnClick 功能
- javascript - 使用脚本拆分 PDF,但不能使用横向 PDF
- swift - 在swift5中将对象列表中的值收集到字典中
- php - 无法使用 iPhone 上的媒体库通过表单上传文件
- bash - 根据文本输出计算退出代码
- javascript - 反应在组件内部获取文本