首页 > 解决方案 > 使用 numpy 布尔索引操作 2D 矩阵需要很长时间

问题描述

我已经生成了大量的随机数据,如下所示:

ndata = np.random.binomial(1, 0.25, (100000, 1000))

这是一个 100,000 x 1000 矩阵(!)

我正在生成新矩阵,其中对于每一行,如果事先所有列的平均值(减去 p=0.25 的伯努利 RV 的期望值)大于等于某个 epsilon,则每一列都是真的。

像这样:

def true_false_inequality(data, eps, data_len):
    return [abs(np.mean(data[:index + 1]) - 0.25) >= eps for index in range(data_len)]

这样做之后,我将生成一个一维数组(终于!),其中每个列表示我在矩阵的同一列中有多少个真值,然后我将每一列除以某个数字(exp_numer = 100,000)

def final_res(data, eps):
    tf = np.array([true_false_inequality(data[seq], eps, data_len) for seq in range(exp_number)])
    percentage = tf.sum(axis=0)/exp_number
    return percentage

此外,我有 5 个不同的 epsilon,我从中迭代 5 次以获得最终结果。(epsilons = [0.001, 0.1, 0.5, 0.25, 0.025])

我的代码确实有效,但是 100,000 行乘 1000 列需要很长时间,我知道我可以通过更多地开发 numpy 功能来使其更快,但我只是不知道如何。

标签: pythonnumpyoptimizationnumpy-ndarray

解决方案


您可以对整个数据数组使用矢量化操作执行整个计算:

mean = np.cumsum(data, axis=1) / np.arange(1, data.shape[1]+1)
condition = np.abs(mean - 0.25) >= eps
percentage = condition.sum(axis=0) / len(data)

推荐阅读