回答
以下是纯Python,并计算两者的平均值和标准偏差(假设1个自由度)在一个单一的通。它直接使用词典理解来计算词典中的z分数值。
但请注意,根据下面的时序示例,它比使用字典键(请参阅下面的zify_scipy
)重新压缩scipy.stats.zscore
的结果要慢3倍左右。
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
测试:在IPython的会话
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)))
然后,我测试zify
对zify_scipy
:
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
。
假设使用SciPy的计算Z分数,而不是手动
从SciPy的进口统计
d = { '键':值,...}
dict_values = d.values()
Z = stats.zscore(dict_values)
这将返回一个Numpy数组,其z分数为
谢谢!我如何获得zscores与相应的键一起回来? – user2783083 2014-11-22 20:12:51
你的意思是一个新的字典与相应的键?那么你可以使用字典理解:'new_dict = {(k,v)for(k,v)in zip(d.keys(),z)}'。编辑:请注意,如果你这样做,最好使用'itertools import izip'而不是普通的'zip' – hopla 2014-11-22 20:20:05
假设d
是您的字典,并且您需要zscores的值。
import scipy.stats as stats
keys, vals = zip(*d.items())
z = stats.zscore(vals)
newmap = dict(zip(keys,z))
所以假设你想计算一个字典中所有值的zscores。并且还假设你知道的平均值和标准偏差
所以,你会根本是什么迭代在所有的值和zscore存储在相同的按键另一个字典。 可以说,DIC是你的百科
import numpy
a={}
for key,value in dic.items():
z=(value-mean)/standarDeviation
a[key]=z
一个将包含所有你zscores,与refernce到相同的密钥DIC。
如果你不知道先计算平均值和标准偏差为
mean=numpy.mean(dic.values())
standardDeviation= numpy.std(dic.values())
dic.values()在你的字典
返回值的列表,但是我会用SciPy的,你可以看到为什么。 .. PS这将很好地工作,如果数据集是小,你想看到的数据是如何平移出...
- 1. 从另一个词典(Python)的所有组合创建词典
- 2. python词典:如何获得具有特定值的所有键
- 3. Python:词典中的词典?
- 4. 将列表条目的词典值设置为列表中的所有词典的词典值
- 5. 带字典的列表 - 所有密钥的计数值(Python)
- 6. 计算表达式的三个词典的值具有相似的键
- 7. 词典到Python的字典
- 8. Python中的字典词典!
- 9. python词典的字典
- 10. 结合词典的两个词典(Python)
- 11. 从Python词典求和值
- 12. python - 计数文件(无法计算字典中的值)
- 13. Python中的词典
- 14. 嵌套的默认词典计数值
- 15. 收集Python列表中的词典值
- 16. Python排序词典的大多数值
- 17. 计算utf8的所有可能值
- 18. 计算anylogic中流量的所有值
- 19. 计算特定html标记中单词的集合词典
- 20. 创建多维词典来计算词的出现
- 21. 从字典中计算单词吗?
- 22. 如何计算Python中所有列的异常值?
- 23. 计算Python中字典键的唯一值的数量
- 24. 计算Python中列的单词频率
- 25. Python:计算字典中的频率
- 26. 计算字典中的值的频率
- 27. 计算总值字典
- 28. Marklogic值词典和单词词典
- 29. 词典在Python
- 30. Python倒词典
也许你需要它从字典中提取值列表?如果'd'是你的字典,那么你可以通过调用'd.values()'来做到这一点。 – Thibaut 2014-11-22 19:52:38
我试图转换为值列表,但我不明白如何将它们与原始密钥一起放回到字典中。 (对不起,如果这不是我的...) – user2783083 2014-11-22 20:09:52