基于OrderedDict权重调用np.random.choice返回嵌套空列表问题
解决numpy.random.choice返回多层嵌套列表的问题
你遇到的这个嵌套列表问题,根源是用错了np.random.choice的参数。让我给你拆解清楚:
为什么会出现多层嵌套?
np.random.choice的第二个参数是size,用来指定输出数组的形状。你把first_word_values(也就是[2,2,1,...])直接传给了这个参数,numpy会把这个列表当成多维数组的形状参数,生成一个对应层级的嵌套结构——这完全不是你想要的加权随机选择效果。
正确的加权选择用法
你需要用p参数来指定每个元素的权重(注意p需要是总和为1的概率分布),或者先把元素按权重重复后再随机选取。这里给你两种靠谱的方案:
方案1:使用概率参数p(推荐,高效)
把你的整数计数转换成概率分布,再传给p参数,同时指定size=1来获取单个结果:
import numpy as np from collections import OrderedDict # 你的OrderedDict对象 words = OrderedDict([('počivaj', 2), ('v', 2), ('ki', 1), ('šibki', 1), ('še', 1), ('srečno', 1), ('popji', 1), ('le', 1), ('ko', 1), ('let', 1), ('angelj', 1), ('rože', 1), ('mlade', 1), ('mirno', 1), ('ne', 1), ('zibki', 1), ('topli', 1), ('dni', 1), ('cvet', 1), ('šteješ', 1)]) first_word_keys = list(words.keys()) first_word_values = list(words.values()) # 将计数转换为概率分布(总和为1) prob_weights = np.array(first_word_values) / sum(first_word_values) # 加权随机选1个元素,用.item()取出字符串而不是数组 selected_word = np.random.choice(first_word_keys, size=1, p=prob_weights).item() print(selected_word)
方案2:先重复元素再随机选取(直观,适合小数据量)
如果你的数据量不大,可以先把每个键按照它的计数重复,生成一个扁平列表,再从中随机选一个:
import numpy as np from collections import OrderedDict words = OrderedDict([('počivaj', 2), ('v', 2), ('ki', 1), ('šibki', 1), ('še', 1), ('srečno', 1), ('popji', 1), ('le', 1), ('ko', 1), ('let', 1), ('angelj', 1), ('rože', 1), ('mlade', 1), ('mirno', 1), ('ne', 1), ('zibki', 1), ('topli', 1), ('dni', 1), ('cvet', 1), ('šteješ', 1)]) # 生成按权重重复的扁平列表 weighted_list = [] for key, count in words.items(): weighted_list += [key] * count # 随机选1个元素 selected_word = np.random.choice(weighted_list, size=1).item() print(selected_word)
这两种方法都能直接返回单个字符串,不会出现嵌套列表的问题,你可以根据自己的数据规模选择合适的方案。
内容的提问来源于stack exchange,提问作者Nephilim
相关产品推荐
相关产品推荐

