假设我在一个numpy数组中有一组概率:
0.25,0.12.5,0.125,0.50
我想要生成N个热编码的结果,与每个概率成正比:
0,0,0,1应该是结果的50%,0,0,1,0应该是12.5%的时间
诸若此类。
我可以一个一个地写些东西来做这些事情,但是我需要几百万的结果,所以用numpy作为后盾是很理想的。
发布于 2022-08-12 00:07:24
可以将multinomial发行版与n=1一起使用。
In [36]: rng = np.random.default_rng()
In [37]: a = np.array([0.25, 0.125, 0.125, 0.50])
In [38]: N = 10
In [39]: rng.multinomial(1, a, size=N)
Out[39]:
array([[0, 0, 0, 1],
[0, 0, 0, 1],
[0, 0, 0, 1],
[1, 0, 0, 0],
[0, 0, 0, 1],
[0, 0, 0, 1],
[0, 0, 1, 0],
[1, 0, 0, 0],
[0, 0, 0, 1],
[0, 0, 0, 1]])生成一个大的示例,并检查列的平均值--它们应该接近a
In [40]: N = 1000000
In [41]: x = rng.multinomial(1, a, size=N)
In [42]: x.mean(axis=0)
Out[42]: array([0.249467, 0.125005, 0.124565, 0.500963])发布于 2022-08-11 18:58:54
IIUC,您可以使用numpy.random.choice和数组作为概率来选择如何在零数组中设置1:
a = np.array([0.25, 0.125, 0.125, 0.50])
out = np.zeros_like(a, dtype=int)
out[np.random.choice(range(len(a)), p=a)] = 1
print(out)示例:array([0, 0, 0, 1])
对N值的推广
a = np.array([0.25, 0.125, 0.125, 0.50])
N = 10
out = np.zeros((N, len(a)), dtype=int)
out[np.arange(N), np.random.choice(range(len(a)), p=a, size=N)] = 1示例:
[[0 1 0 0]
[0 0 0 1]
[1 0 0 0]
[0 0 0 1]
[0 0 0 1]
[0 0 0 1]
[0 0 1 0]
[0 0 0 1]
[0 0 0 1]
[0 0 0 1]]发布于 2022-08-11 19:01:27
Numpy的random.choice可以应用概率。
import numpy as np
opts = [0.25,0.125,0.125,0.5]
outcomes = [[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]
z = np.random.choice(4,size=50000,p=opts)
print(z)
z = np.take(outcomes,z,axis=0)
print(z)https://stackoverflow.com/questions/73325614
复制相似问题