gpt4 book ai didi

python - 从概率矩阵中随机选择

转载 作者:行者123 更新时间:2023-11-28 18:05:27 26 4
gpt4 key购买 nike

我正在尝试制作一个将传入消息发送到输出端口的模拟器。我得到了输入端口的数量 (N) 和输出端口的数量 (M) 以及 N*M (mat) 的扁平概率矩阵。我还得到了传入消息的数量作为数组 (in_freq)。我认为,为了将每条消息从输入端口定向到输出端口,我应该使用 numpy.random.choice,但没能成功。

我尝试的是:

 for k in range (N):  
enqueue = np.random.choice(M, in_freq[k], p=[(mat[k*N:k*N+M-1])])

当 enqueue 是消息目的地的数组时。

但是遇到了消息:

ValueError: object too deep for desired array

最佳答案

问题

ValueError正如 hpaulj 在评论中指出的那样,您看到的是因为您的 p参数包含在列表括号中 [] .这个额外的封闭 list使 np.random.choice解读你的p作为形状的二维数组 (1, x)而不是一维数组。自从你对 np.random.choice 提出第一个论点以来是一个整数,函数需要 p是一维的,因此当它发现它不是一维时会抛出错误(有关完整详细信息,请参阅 choice docs)。

你可以修复 ValueError通过删除 p 周围的括号:

enqueue = np.random.choice(M, in_freq[k], p=mat[k*N:k*N+M-1])

但是,现在您的代码将引发一个新的和不同的 ValueError :

ValueError: a and p must have same size

ValueError是由于您生成扁平 NxM 矩阵的行切片的方式造成的 mat是不正确的。

解决方案

从您问题的描述来看,您的意图似乎是循环遍历原始 2D mat 的行。通过切片 1D mat .以下是如何修复代码中的切片,以便迭代 mat 的行在你的for循环:

import numpy as np

N = 10
M = 5

in_freq = np.random.randint(0, 10, N)
mat = np.random.rand(N, M)
# normalize so that each row is a probability dist
mat /= mat.sum(axis=1, keepdims=True)
# flatten to match OP's question
mat = mat.flat

for k in range(N):
print((M*k, M*(k + 1)))
enqueue = np.random.choice(M, in_freq[k], p=mat[M*k:M*(k + 1)])

测试

为了证明现在生成了正确的切片,我添加了一个打印语句,在 for 的每次迭代中输出切片索引。环形。这是它的输出:

(0, 5)
(5, 10)
(10, 15)
(15, 20)
(20, 25)
(25, 30)
(30, 35)
(35, 40)
(40, 45)
(45, 50)

这表明迭代 mat 的行所需的切片现在确实正在按预期生成。

关于将 2D 索引转换为其 1D 扁平等价物的注意事项

给定一个数组 N行和 M列,转换 2D 的一般公式 x,y索引到其扁平化的一维等价物 i是:

i = x + M*y

您可以在此 old thread 中找到更深入的讨论.

关于python - 从概率矩阵中随机选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53694760/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com