【发布时间】:2017-09-19 13:39:25
【问题描述】:
我正在使用numpy 从这样的元组列表中查找中值:
print(np.median( [x[1] for x in pairs]) )
Pairs 本身来自collections.namedtuple,它们各自看起来像这样:
Pair(hash=u'0x034c9e7f28f136188ebb2a2630c26183b3df90c387490159b411cf7326764341', gas=21000)
Pair(hash=u'0xffda7269775dcd710565c5e0289a2254c195e006f34cafc80c4a3c89f479606e', gas=1000000)
Pair(hash=u'0x90ca439b7daa648fafee829d145adefa1dc17c064f43db77f573da873b641f19', gas=90000)
Pair(hash=u'0x7cba9f140ab0b3ec360e0a55c06f75b51c83b2e97662736523c26259a730007f', gas=40000)
Pair(hash=u'0x92dedff7dab405220c473aefd12e2e41d260d2dff7816c26005f78d92254aba2', gas=21000)
这是我确定中位数的方法:
pairs = list(_as_pairs(dict_hash_gas))
# pprint.pprint(pairs)
if pairs:
# Avoid a ValueError from min() and max() if the list is empty.
print(min(pairs, key=lambda pair: pair.gas))
print(max(pairs, key=lambda pair: pair.gas))
print(np.median( [x[1] for x in pairs]) )
以下是结构的创建方式:
def _as_pairs(pairs):
for pair in pairs:
# TODO: Verify the dict conatains exactly one item?
for k, v in pair.items():
# Should the `key` string also be an integer?
#yield Pair(key=int(k, base=16), value=int(v))
yield Pair(hash=k, gas=int(v))
完整的脚本可以是健全的here。
此刻的输出是这样的:
Pair(hash=u'0xf4f034e23b4118cb4aa4e9d077f0f28d675e25e9dc2650225f32ac33e04c93aa', gas=21000)
Pair(hash=u'0x92de9056a6357752a46dff1d6ff274d204d450bbd6c51cefe757f199af105cb4', gas=4712388)
90000.0
问题是,我如何输出整个记录,整个Pair,与中值相关联,而不仅仅是中值本身?
【问题讨论】:
-
一开始我以为你可以用
print(np.median((pair.gas, pair) for pair in pairs)[1])替换print(np.median( [x[1] for x in pairs]) ),但那行不通。 -
数据中没有中值怎么办?
-
检查两个相互竞争的潜在值并随机选择其中一个