numpy 从列表中选择多个元素

krcsximq  于 2023-01-05  发布在  其他
关注(0)|答案(2)|浏览(291)

我试着为elements中的每个元素做一个选择,然后我将elements列表中的元素与它的优先选择(一,二或三)配对。选择主要是根据元素的概率(weights)来完成的。

from numpy.random import choice
elements = ['one', 'two', 'three']
weights = [0.2, 0.3, 0.5]
chosenones= []
for el in elements:
    chosenones.append(choice(elements,p=weights))
tuples = list(zip(elements,chosenones))

产量:

[('one', 'two'), ('two', 'two'), ('three', 'two')]

我需要的是,每个元素做两个选择,而不是一个。
预期输出应如下所示:

[('one', 'two'), ('one', 'one'), ('two', 'two'),('two', 'three'), ('three', 'two'), ('three', 'one')]

你知道怎么输出这个吗?

wztqucjr

wztqucjr1#

如果需要两个值,只需告诉numpy.random.choice()选择两个值;循环时将el值作为元组包含进来(不需要使用zip()):

tuples = []
for el in elements:
    for chosen in choice(elements, size=2, replace=False, p=weights):
        tuples.append((el, chosen))

或者通过使用列表解析:

tuples = [(el, chosen) for el in elements
          for chosen in choice(elements, size=2, replace=False, p=weights)]

通过设置replace=False,可以获得唯一值;请将其删除或显式设置为True以允许重复。请参阅numpy.random.choice()文档:

大小:* 整数或整数元组,可选 *

输出形状。如果给定的形状为(m, n, k),则绘制m * n * k样本。默认值为None,在这种情况下返回单个值。

替换:* 布尔值,可选 *

样品是否更换
演示:

>>> from numpy.random import choice
>>> elements = ['one', 'two', 'three']
>>> weights = [0.2, 0.3, 0.5]
>>> tuples = []
>>> for el in elements:
...     for chosen in choice(elements, size=2, replace=False, p=weights):
...         tuples.append((el, chosen))
...
>>> tuples
[('one', 'three'), ('one', 'one'), ('two', 'three'), ('two', 'two'), ('three', 'three'), ('three', 'two')]
>>> [(el, chosen) for el in elements for chosen in choice(elements, size=2, replace=False, p=weights)]
[('one', 'one'), ('one', 'three'), ('two', 'one'), ('two', 'three'), ('three', 'two'), ('three', 'three')]
mpgws1up

mpgws1up2#

如果您接受副本,random.choices将执行以下操作:
随机选择(总体,权重=无,*,累积权重=无,k=1)
返回从具有替换的填充中选择的k大小的元素列表。如果填充为空,则引发IndexError。
如果指定了权重序列,则根据相对权重进行选择。

>>> random.choices(['one', 'two', 'three'], weights=[0.2, 0.3, 0.5], k=2)
['one', 'three']

相关问题