python - 使用 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 功能来使其更快,但我只是不知道如何。
解决方案
您可以对整个数据数组使用矢量化操作执行整个计算:
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)
推荐阅读
- php - 尝试访问符号链接时如何修复 403 错误?
- python - 变量未覆盖 - 烧瓶用户输入以更改变量
- javascript - 有5个“li”元素,如何交换第一个“li”元素和最后一个“li”元素?
- c# - React.js 仅在读取 PDF 表单文件时显示输入字段
- c# - SecurityTokenExpiredException:IDX10223:生命周期验证失败。令牌已过期。ValidTo:'System.DateTime',当前时间:'System.DateTime'
- spring-boot - 当执行器健康在不同端口上运行时如何拦截执行器健康请求
- linux-kernel - SWUpdate 错误的 mmc 设备地址
- database - 如何使用 sqlite3 作为磁盘支持的 O(n) 哈希表?
- markdown - 引用 ReadTheDocs 页面的正确方法(路径中有或没有 .html)
- c++ - 如何在 C++ 中重载 = 以便在创建对象时使用它?