python - 从多维数组矢量化采样
问题描述
我有一个形状的 numpy 数组D x N x K
。
我需要一个D x N
来自 K 个类的随机元素的结果数组,其中每个索引[d, n]
都有一个不同的类概率向量,由第三个轴表示。
numpy 文档仅np.random.choice
允许概率的一维数组。
我可以对这种类型的采样进行矢量化,还是必须使用 for 循环,如下所示:
# input_array of shape (D, N, K)
# output_array of shape (D, N)
for d in range(input_array.shape[0]):
for n in range(input_array.shape[1]):
probabilities = input_array[d, n]
element = np.random.choice(K, p=probabilities)
output_array[d, n] = element
如果有这样的功能,我会喜欢的
output_array = np.random.choice(input_array, K, probability_axis=-1)
编辑:设法在这里找到“手工设计”的解决方案。
解决方案
既不np.random.choice
也不np.random.default_rng().choice
支持以您想要的方式广播概率。但是,您可以使用以下方法拼凑一些类似的东西np.cumsum
:
sprob = input_array.cumsum(axis=-1, dtype=float)
sprob /= sprob[:, :, -1:]
output_array = (np.random.rand(D, N, 1) > sprob).argmin(-1)
不幸的是,np.searchsorted
也不支持多维查找(可能出于相关原因)。
推荐阅读
- excel - TextBox1_Lostfocus 的代码在文本框“失去焦点”之前开始运行
- laravel - Laravel - PHP Artisan Serve - 新项目
- java - 使用 Java 客户端进行 Elasticsearch 查询序列化
- c - C语言中的if语句
- javascript - 如何使这个反应组件的项目左对齐,容器居中?
- spring - 如何设置 Zuul 设置
- selenium - 每次更改页面时抓取页面
- modelica - 我如何使用“fmi2GetDirectionalDerivative”?
- javascript - 使用 php 和 ajax 验证字段并使用部分
- amazon-web-services - 时间范围内的 Cloudwatch 警报