gpt4 book ai didi

Python:将字典的所有值计算为z分数

转载 作者:行者123 更新时间:2023-12-01 04:57:21 25 4
gpt4 key购买 nike

我有一本字典,我想计算它的所有值到 zscores。现在我确实知道如何计算数组的 zscore,但不知道如何对字典执行此操作。有人有什么建议吗?

谢谢!

最佳答案

以下是纯 Python,一次计算平均值和标准差(假设自由度为 1)。它直接使用字典理解来计算字典中的 z 分数值。

但请注意,根据下面的计时示例,它比使用 dict 键重新压缩 scipy.stats.zscore 的结果慢约 3 倍(请参阅 zify_scipy) > 如下)。

from math import sqrt

def zify(some_dict):
arr = some_dict.values()
sum_sq = x_bar = 0
for i, val in enumerate(arr):
x_bar += val
sum_sq += val * val
n = 1 + i
x_bar *= 1.0/n
std = sqrt(1.0/i * sum_sq - (float(n) / i) * x_bar * x_bar)
return {k:(v - x_bar)/std for k,v in some_dict.iteritems()}

test = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5, 'f':6}
print zify(test)

# {'a': -1.3363062095621223, 'c': -0.26726124191242445,
# 'b': -0.8017837257372734, 'e': 0.8017837257372734,
# 'd': 0.26726124191242445, 'f': 1.3363062095621223}
# compare with scipy.stats.zscore(test.values(), ddof=1)

使用answer基于scipy.stats.zscore(下面称为zify_scipy),我们可以设置一些示例来使用timeit进行测试:

import numpy as np
from itertools import izip
from scipy.stats import zscore

def zify_scipy(d):
keys, vals = zip(*d.items())
return dict(zip(keys, zscore(vals, ddof=1)))

# test cases
test1 = dict(izip(range(1000), np.random.randn(1000)))
test2 = dict(izip(range(10000), np.random.randn(10000)))
test3 = dict(izip(range(100000), np.random.randn(100000)))

然后在 IPython session 中,我针对 zify_scipy 测试了 zify:

In [411]: %timeit zify_scipy(test1)
1000 loops, best of 3: 407 µs per loop

In [412]: %timeit zify(test1)
1000 loops, best of 3: 1.42 ms per loop

In [413]: %timeit zify_scipy(test2)
100 loops, best of 3: 4.43 ms per loop

In [414]: %timeit zify(test2)
100 loops, best of 3: 14.3 ms per loop

In [415]: %timeit zify_scipy(test3)
10 loops, best of 3: 58.8 ms per loop

In [416]: %timeit zify(test3)
10 loops, best of 3: 144 ms per loop

一个注意事项:您是否使用 zip(*d.items()) 技巧来获取位置匹配的键/值数组,而不是首先获取值,然后执行另一次迭代字典理解(正如我在实现 zify 结束时所做的那样)似乎与时间无关。无论哪种方式,您都必须迭代两次(一次计算平均值/标准差,一次转换值)。

对于纯 Python 来说,大约 3 倍的速度减慢并不是那么糟糕。对于中等规模的用例,我会觉得这是一种避免对 scipy 的额外依赖的方法。但对于已经使用 numpy/scipy 的项目,请使用 zify_scipy

关于Python:将字典的所有值计算为z分数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27081784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com