在python中从列表中选择两个数字,其概率随它们之间的相对距离衰减

在python中从列表中选择两个数字,其概率随它们之间的相对距离衰减,python,numpy,random,probability,Python,Numpy,Random,Probability,我试图从列表中随机选择一个数字I。接下来,我想选择第二个元素j。选择j的概率随着1/|i-j衰减。例如,它选择距离我的初始i四步远的j的相对概率为1/4,选择紧靠我的i的j的概率为1/4 到目前为止,我一直在尝试填充我的列表,选择我的I,然后使用列表中所有其他元素的|I-j计算权重 import numpy as np import random as random list = [1,2,3,4,5,6,7,8,9,10] a = 1 n1 = random.choice(range(len(

我试图从列表中随机选择一个数字
I
。接下来,我想选择第二个元素
j
。选择
j
的概率随着
1/|i-j
衰减。例如,它选择距离我的初始
i
四步远的
j
的相对概率为1/4,选择紧靠我的
i
j
的概率为1/4

到目前为止,我一直在尝试填充我的列表,选择我的
I
,然后使用列表中所有其他元素的
|I-j
计算权重

import numpy as np
import random as random
list = [1,2,3,4,5,6,7,8,9,10]
a = 1
n1 = random.choice(range(len(list)))
n1_coord = (n1, list[n1])
print(n1_coord)
prob_weights = []
for i in range(0, n1):
    wt = 1/((np.absolute(n1-i)))
    #print(wt)
    prob_weights.append(wt)
for i in range(n1+1,len(list)):
    wt = 1/((np.absolute(n1-i)))
    prob_weights.append(wt)
是否有一个内置于python中的函数,我可以将这些权重输入其中,选择一个具有此概率分布的
j
。我是否可以将权重数组输入到:

numpy.random.choice(a, size=None, replace=True, p=None)
我想我会让p=prob_权重出现在我的代码中

 import numpy as np
    import random as random
    list = [1,2,3,4,5,6,7,8,9,10]
    a = 1
    n1 = random.choice(range(len(list)))
    n1_coord = (n1, list[n1])
    print(n1_coord)
    prob_weights = []
    for i in range(0, n1):
        wt = 1/((np.absolute(n1-i)))
        #print(wt)
        prob_weights.append(wt)
    for i in range(n1+1,len(list)):
        wt = 1/((np.absolute(n1-i)))
        prob_weights.append(wt)
    n2 = np.random.choice(range(len(list)), p=prob_weights)
    n2_coord = (n2, list[n2])

np.random.choice
运行上面的命令会给我一个错误。我甚至不确定这是否是我想让它做的。是否有其他方法可以执行此操作?

此函数有一个内置函数:,它接受一个
weights
参数

给定第一个选定的索引
n1
,您可以执行以下操作

indices = range(len(mylist))
weights = [0 if i == n1 else 1 / abs(i - n1) for i in indices]
n2 = random.choices(indices, weights=prb_wts, k=1).
通过将第一个项目的权重设置为零,可以防止它被选中

使用numpy时,数值运算速度确实会更快,因此您可以使用,它接受
p
参数:

values = np.array([...])
indices = np.arange(values.size)

n1 = np.random.choice(indices)
i = values[n1]

delta = np.abs(indices - n1)
weights = np.divide(1.0, delta, where=delta)
n2 = np.random.choice(indices, p=weights)
j = values[n2]

作为次要的吹毛求疵,不要调用变量
list
,因为它隐藏了一个内置变量,
import x As x
就是
import x

哦,哇!我不需要两个for循环来创建权重数组。权重索引的排序方式是否与原始列表的索引相同?@jcp yes。权重列表的大小与数字列表的大小相同。元素按索引对应。由于权重只取决于位置,而不取决于值,列表理解不会直接引用列表。哦,太好了。非常感谢。我猜我的原始代码出现的错误是大小不匹配。按你的方式做当然可以解决问题。只是为了确保:prb_wts=[0如果i==n1,则为1/abs(i-n1)对于范围内的i(len(mylist))]n2=np.random.choices(range(len(mylist)),weights=prb_wts,k=1)。这将引发一个新错误:AttributeError:模块“numpy.random”没有属性“choices”。我正在运行python 3.7.0。此功能仅在较新版本中可用吗?@jcp。选项位于普通Python随机模块中,而不是np.random。链接的文档应该说明这一点。我还添加了一个numpy解决方案。你可能应该在你的问题上加上一个numpy标签。