首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从numpy数组高效地生成合成数据

从numpy数组高效地生成合成数据
EN

Stack Overflow用户
提问于 2022-08-11 18:53:51
回答 3查看 72关注 0票数 -1

假设我在一个numpy数组中有一组概率:

0.25,0.12.5,0.125,0.50

我想要生成N个热编码的结果,与每个概率成正比:

0,0,0,1应该是结果的50%,0,0,1,0应该是12.5%的时间

诸若此类。

我可以一个一个地写些东西来做这些事情,但是我需要几百万的结果,所以用numpy作为后盾是很理想的。

EN

回答 3

Stack Overflow用户

发布于 2022-08-12 00:07:24

可以将multinomial发行版与n=1一起使用。

代码语言:javascript
复制
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

代码语言:javascript
复制
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])
票数 2
EN

Stack Overflow用户

发布于 2022-08-11 18:58:54

IIUC,您可以使用numpy.random.choice和数组作为概率来选择如何在零数组中设置1:

代码语言:javascript
复制
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值的推广

代码语言:javascript
复制
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

示例:

代码语言:javascript
复制
[[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]]
票数 1
EN

Stack Overflow用户

发布于 2022-08-11 19:01:27

Numpy的random.choice可以应用概率。

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73325614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档