有效选择具有给定概率的随机矩阵索引

杰伯特

我有几分概率的数组,例如:

[[0.1,  0,   0.3,],
  0.2,  0,   0.05],
  0,    0.15, 0.2 ]]

我想从此矩阵中选择一个元素(例如,选择一些索引(i,j)),并根据该矩阵对概率进行加权。可以使用的实际矩阵很大(最大为1000x1000),因此我正在寻找一种有效的方法来实现。这是我目前的解决方案:

def weighted_mat_choice(prob_mat):
    """
    Randomly select indices of the matrix according to the probabilities in prob_mat
    :param prob_mat: Normalized probabilities to select each element
    :return: indices (i, j) selected
    """
    inds_mat = [[(i, j) for j in xrange(prob_mat.shape[1])] for i in xrange(prob_mat.shape[0])]
    inds_list = [item for sublist in inds_mat for item in sublist]
    inds_of_inds = xrange(len(inds_list))
    prob_list = prob_mat.flatten()
    pick_ind_of_ind = np.random.choice(inds_of_inds, p=prob_list)
    pick_ind = inds_list[pick_ind_of_ind]
    return pick_ind

这绝对没有效率。(基本上,将矩阵线性化,创建索引元组列表,然后进行相应选择。)有没有更好的选择方法?

亨利

您不需要选择元组列表。只需使用一个arange(n)数组,然后将其转换回二维即可unravel_index()

import numpy as np

p = np.array(
[[0.1,  0,   0.3,],
 [0.2,  0,   0.05],
 [0,    0.15, 0.2]]
)

p_flat = p.ravel()
ind = np.arange(len(p_flat))

res = np.column_stack(
    np.unravel_index(
        np.random.choice(ind, p=p_flat, size=10000),
        p.shape))

结果:

array([[0, 2],
       [2, 2],
       [2, 1],
       ..., 
       [1, 0],
       [0, 2],
       [0, 0]], dtype=int64)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

numpy中的每列矩阵索引有效

有没有一种有效的方法来生成具有给定总和或平均值的范围内的N个随机整数?

检查给定的矩阵是否具有有效尺寸-JAVA

有效地选择随机数

具有给定概率的切片/阵列中的Golang选择数

一般选择有效的随机枚举值

python:具有概率的随机样本

无法对“选择”执行“ getRangeAt”:0不是有效索引

比igraph :: random_walk()更有效的方式在过渡矩阵上运行随机游走

具有不同概率的随机抽样

随机排列数组,同时使每个索引在任何索引中具有相同的概率

从具有给定概率的阵列中随机选择而不进行替换

具有自定义概率分布的随机索引

根据给定的概率有效地改变二进制字符串中的字符

是否所有数字都具有从随机排列中选择的相等概率?

具有预定义概率的c#订单的无状态随机选择

有条件概率的随机选择

有效地从文本文件中读取具有字符串索引的巨大二维数组(矩阵)

基于R?中某些值和索引矩阵的更有效的数据矩阵获取方法。

从给定概率的有限选项集中选择伪随机

如何处理“仅对具有唯一值的索引对象有效的索引”

具有概率的随机函数

JAVA:随机产生具有概率的整数

随机选择设置位的有效方法

在Boost Graph Library中选择给定顶点的随机输入或输出邻居的有效方法?

在 R 或 Python 中随机化矩阵的最有效方法

选择具有非连续索引的犰狳子矩阵

具有给定列列表的 Postgres 复合索引有效性

给定两个 NxD 矩阵,以更有效的实现方式生成 NxDxD 矩阵