python - 在大型 numpy 数组上应用聚合函数
问题描述
我正在尝试计算大型 numpy 数组的平均值。最初,我尝试过:
data = (np.ones((10**6, 133))
for _ in range(100))
np.stack(data).mean(axis=0)
但我得到了
numpy.core._exceptions.MemoryError:无法为形状为 (100, 1000000, 133) 且数据类型为 float32 的数组分配 xxx GiB
在原始代码中,数据是更有意义的向量的生成器。
我考虑过使用 dask 进行这样的操作,希望它将我的数据分成由磁盘支持的块。
import dask.array as da
import numpy as np
data = (np.ones((10**6, 133)) for _ in range(100))
x = da.stack(da.from_array(arr, chunks="auto") for arr in data)
x = da.mean(x, axis=0)
y = x.compute()
但是,当我运行它时,该过程以“Killed”终止。
如何在单机上解决此问题?
解决方案
您可以尝试这种方法:
agg_sum = np.zeros((10**6, 133))
total = 100
for dt in data:
agg_sum = agg_sum + dt
_mean = agg_sum/total
推荐阅读
- sql-server - 为什么我的断点没有命中来自网络服务器的 Visual Studio 2019 调试脚本中的 SQL
- javascript - Django 管理员 - 自动完成选择不会发出“更改”事件
- signalr - SignalR 服务器 (C#.net) 中的全局变量是否应该在调用不同的函数后保持其值?
- python - QQmlApplicationEngine 设置后丢失上下文
- r - 如何在被编织成 HTML 的 R 降价文档中嵌入推文?
- reactjs - 尝试在 gatsby-node 中创建页面时,我收到此构建错误
- ios - 单个组件的动画搞砸了整个视图——SwiftUI
- r - RShiny:取决于 NULL 值的条件成功或错误消息
- vue.js - 在 Laravel Nova Vue 组件中观看动态渲染的字段
- opencv - 需要一些帮助来减少使用 OpenCV 3.4.1 DNN 模块通过我的 MobileNet SSD 对象检测检测到的对象类