从 python 中的列表中选择两个数字,概率随着它们之间的相对距离而衰减
Selecting two numbers from a list in python with a probability that decays as the relative distance between them
我正在尝试获取一个列表,然后从中随机选择一个数字 i
。接下来,我想 select 第二个元素 j
。选择 j
的概率衰减为 1/|i-j|
。例如,它选择 j
距离我最初的 i
四步的相对概率是 1/4, select 紧挨着我的 j
的概率i
.
到目前为止,我一直在尝试填充我的列表,选择我的 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_weights 在我的代码中?
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
给我一个错误。我什至不确定这是否是我一开始想要做的事情。有替代方法吗?
为此有一个内置函数:random.choices
,它接受一个 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 时,数值运算确实会更快,因此您可以使用 np.random.choice
,它接受 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
.
我正在尝试获取一个列表,然后从中随机选择一个数字 i
。接下来,我想 select 第二个元素 j
。选择 j
的概率衰减为 1/|i-j|
。例如,它选择 j
距离我最初的 i
四步的相对概率是 1/4, select 紧挨着我的 j
的概率i
.
到目前为止,我一直在尝试填充我的列表,选择我的 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_weights 在我的代码中?
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
给我一个错误。我什至不确定这是否是我一开始想要做的事情。有替代方法吗?
为此有一个内置函数:random.choices
,它接受一个 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 时,数值运算确实会更快,因此您可以使用 np.random.choice
,它接受 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
.