Python字典截断键

3
我正在使用Python进行黎曼积分的实验。 我有几个函数:
def myfunc(x, mu, sigma):

    px = np.exp(-(x-mu)**2/(2*sigma**2))
    return px

def get_area(h,mu,sigma):
    x = np.arange(-100,100+h,h)
    return sum([myfunc(xi,mu,sigma)*h for xi in x])

我正在尝试探索mu和sigma的变化对函数下面积的影响。我是这样做的:

sigma_range = [0.25,0.5,1,2]
h_range = [2,1,0.1,0.001,0.00001]

result_dict = {}

for sigma in sigma_range:
    sigma_dict = {}
    for h in h_range:
        sigma_dict[str(repr(h))] = sigma_dict.get(str(h), [])
        sigma_dict[str(repr(h))].append(get_area(h,1,sigma))
        result_dict[str(sigma)] = sigma_dict

经过调查,其中一个sigma值(作为键)被截断。"0.00001"变成了"1e-05"。

result_dict["0.25"]

{'2': [0.0013418505116100474],
 '1': [1.0006709252558303],
 '0.1': [0.6266570686577856],
 '0.001': [0.6266570686547552],
 '1e-05': [0.6266570684587373]}

当我将其放置在pandas DataFrame中时,键的顺序也会混乱,导致另一个错误。

enter image description here

如果它们至少按正确顺序排列,我可以接受,因为分析会很简单。然而,不得不从一行跳到另一行,使整个过程变得繁琐。
在发布之前,我阅读了相关内容,并看到有时获取值的repr()函数会起作用,但这并没有奏效。
我认为增加列宽可能会有所帮助,但这只适用于值列,而不是索引(无论如何,在创建字典时出现问题,而不是在DF本身)。

为什么要将密钥作为字符串而不是简单地作为浮点数使用? - LeoE
@LeoE 我尝试使用浮点数作为键,但结果相同,“0.00001”变成了“1e-05”。 - Michal B.
对我来说不是这样,Dataframe 已经正确排序了。在 Dataframe 创建过程中从 0.000011e-05 没有任何更改。 - LeoE
0.00001和1e-05是同一个数字,与1和01是同一个数字的本质没有区别。 - jasonharper
@jasonharper,我知道它们实际上是相同的数字,只是用不同的方式表示。然而这对我来说行不通。 - Michal B.
显示剩余2条评论
3个回答

2
在这种情况下,您应该尝试使用可以传递给format的选项。特别是浮点数规范:"{:f}"
for sigma in sigma_range:
    sigma_dict = {}
    for h in h_range:
        sigma_dict["{:f}".format(h)] = sigma_dict.get(str(h), [])
        sigma_dict["{:f}".format(h)].append(get_area(h,1,sigma))
        result_dict[str(sigma)] = sigma_dict

然后:

>>> result_dict["0.25"]
{'2.000000': [0.0013418505116100474],
 '1.000000': [1.0006709252558303],
 '0.100000': [0.6266570686577856],
 '0.001000': [0.6266570686547552],
 '0.000010': [0.6266570684587373]}

0
浮点数规范:"{:f}" 可以使用,除非您不需要7位小数。

"{:f}".format(0.00000001) 将会给你 "0.000000"


它可以作为一个临时解决方案。 然而,在未来使用它时,我应该谨慎。 谢谢! - Michal B.

0

不需要任何格式等,只需像评论中建议的那样使用浮点数作为键。

这段代码:

result_dict = {}

for sigma in sigma_range:
    sigma_dict = {}
    for h in h_range:
        sigma_dict[h] = sigma_dict.get(h, [])
        sigma_dict[h].append(get_area(h,1,sigma))
        result_dict[sigma] = sigma_dict
df = pd.DataFrame(result_dict)

生成这个数据框:
                            0.25
0.00001      [0.626657068681351]
0.00100     [0.6266570686580978]
0.10000     [0.6266570686577523]
1.00000     [1.0006709252558303]
2.00000  [0.0013418505116100474]

1
正如我之前提到的,我已经尝试过这样做了,但最终得到了相同的结果。 下面的答案(格式建议)对我有用! - Michal B.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接