我正在使用 np.loadtxt 读出一个包含一些 float 的文本文件。这是我的 numpy 数组的样子:
x = np.loadtxt(t2)
print(x)
array([[ 1.00000000e+00, 6.61560000e-13],
[ 2.00000000e+00, 3.05350000e-13],
[ 3.00000000e+00, 6.22240000e-13],
[ 4.00000000e+00, 3.08850000e-13],
[ 5.00000000e+00, 1.11170000e-10],
[ 6.00000000e+00, 3.82440000e-11],
[ 7.00000000e+00, 5.39160000e-11],
[ 8.00000000e+00, 1.75910000e-11],
[ 9.00000000e+00, 2.27330000e-10]])
我通过这样做将第一列与第二列分开:
idx, coeffs = zip(*x)
现在,我想创建一个 id : coeff 的映射,像这样:
mapping = dict(zip(map(int, idx), coeffs))
print(mapping)
{1: 6.6155999999999996e-13,
2: 3.0535000000000001e-13,
3: 6.2223999999999998e-13,
4: 3.0884999999999999e-13,
5: 1.1117e-10,
6: 3.8243999999999997e-11,
7: 5.3915999999999998e-11,
8: 1.7591e-11,
9: 2.2733e-10}
如您所见,引入了精度误差。例如,6.61560000e-13 变成了 6.6155999999999996e-13。
这就是我想要的,最好是:
{1: 6.61560000e-13,
2: 3.05350000e-13,
3: 6.22240000e-13,
4: 3.08850000e-13,
...
}
我该怎么做?如果有帮助的话,我正在研究 IPython3。
请您参考如下方法:
Jean-François Fabre's comment 给了我一个想法,我试了一下。考虑到亚历山大关于使用听写理解的建议,这对我有用:
x = np.loadtxt(t2)
mapping = {int(k) : v for k, v in x.tolist()}
print (mapping)
输出:
{1: 6.6156e-13,
2: 3.0535e-13,
3: 6.2224e-13,
4: 3.0885e-13,
5: 1.1117e-10,
6: 3.8244e-11,
7: 5.3916e-11,
8: 1.7591e-11,
9: 2.2733e-10}
之所以可行,是因为 x 是 np.float64 类型。调用 .tolist() 将 x 转换为列表的列表,其中每个元素的类型都是 double. np.float64 和 double 有不同的 __repr__ 实现。 double 使用 David Gay Algorithm 来正确表示这些 float ,而 numpy 的实现要简单得多(只是截断)。
