如果我的密钥是numpy float64数字的dict,我如何通过键值访问它们?
>>> keys = np.arange(0, 0.5, 0.05, dtype=np.float64)
>>> keys
array([..., 0.3 , ...])
# The following creates a dicionary lookup table
# data[x] = exp(x) for all x in keys
>>> data = {key: np.exp(key) for key in keys}
>>> data[0.3]
KeyError: 0.3
>>> data[np.float64(0.3)]
KeyError: 0.29999999999999999
>>> data.keys()
[..., 0.30000000000000004, ...]
numpy浮动甚至可以用作dict的键吗?
答案 0 :(得分:0)
从评论中可以看出,“我正在做的真正的计算并不是你每次想要一个价值时都想要做的事情。有没有更优雅的方式来创建地图?”
这是一个标准问题,通用解决方案称为查找表或LUT。有许多实现,有和没有numpy和scipy,你可以通过搜索找到。 Here's使用scipy插值方法的解决方案。
正如其他人所说,使用浮点数作为字典键是有问题的。此外,使用LUT,您还可以在两个预先计算的解决方案之间进行插值,从而提高精度等。
答案 1 :(得分:0)
由于注释和其他答案中所述的各种原因,这通常是一个坏主意,尤其是对于“生产质量”源代码而言。但是,如果我们只是在处理一个快速而肮脏的python脚本,无论如何尝试它有时还是有用的。
到目前为止,一种对我来说似乎相当可靠的解决方案是使用round()
函数,以确保keys
中的所有数字都与我们将人类输入的数字相同。小数位数。例如(使用Python 3.6
):
>>> import numpy as np
>>> keys = [round(key, 4) for key in np.arange(0, 0.5, 0.05, dtype=np.float64)]
>>> keys
[0.0, 0.050000000000000003, 0.10000000000000001, 0.14999999999999999, 0.20000000000000001, 0.25, 0.29999999999999999, 0.34999999999999998, 0.40000000000000002, 0.45000000000000001]
>>> data = {key: np.exp(key) for key in keys}
>>> data[0.3]
1.3498588075760032
>>> data[np.float64(0.3)]
1.3498588075760032
>>> data.keys()
dict_keys([0.0, 0.050000000000000003, 0.10000000000000001, 0.14999999999999999, 0.20000000000000001, 0.25, 0.29999999999999999, 0.34999999999999998, 0.40000000000000002, 0.45000000000000001])
由于内部(浮点)表示,键仍然可以有很多小数位,但是至少它们与人类输入的新浮点数保持一致,例如0.3
。