python - 如何在使用 h5py 的基本数学运算上不使用所有内存?
问题描述
我有 2 个使用 h5py 存储的大型数组。我想做一些基本的 numpy 操作,如加法、减法等。最优雅的方法是什么?
f = h5py.File('x', 'w')
d1 = f.create_dataset('1', (100000, 10000), 'i')
d2 = f.create_dataset('2', (100000, 10000), 'i')
d2[:] = 1
np.add(d2, d2, out=d1)
np.add() 的输出参数有问题,因为它不是 ArrayType。我假设我需要通过自己加载整个文件来实现添加功能,所以不要“吃掉”所有的内存,对吧?像这样的东西:
for block_index in range(d2.shape[0]):
d1[block_index:] = d2[block_index:] + d2[block_index:]
或者有没有更好的解决方案?
谢谢
解决方案
你是对的; d1
并且d2
是 h5py 数据集对象,而不是 numpy ndarrays。您需要添加 [:] 以从数据集中获取 ndarray。
我修改了上面的示例以创建数据集1
和2
(每个都填充了常量值),然后将它们添加为 ndarray. 结果是一个新的 ndarray( d3_arr
),然后将其保存到新的数据集3
。
示例 1:
import h5py, numpy as np
with h5py.File('SO_57868593.h5', 'w') as h5f :
d1 = h5f.create_dataset('1', (10, 10), 'i')
d2 = h5f.create_dataset('2', (10, 10), 'i')
d1[:] = 1
d2[:] = 2
d3_arr = np.ndarray( (10, 10), 'i' )
np.add(d1[:], d2[:], out=d3_arr)
d3 = h5f.create_dataset('3', data=d3_arr)
print ('done')
示例2:
在该方法中,首先创建数据集3(空/无数据),d3_arr 是一个单行的ndarray。for 循环遍历 d1 和 d2 的行,将它们相加得到 d3_arr,然后将 d3_arr 复制到数据集 3 中的匹配行中。
# replace/reorder code below as shown
# d3_arr = np.ndarray( (10, 10), 'i' )
# np.add(d1[:], d2[:], out=d3_arr)
# d3 = h5f.create_dataset('3', data=d3_arr)
d3 = h5f.create_dataset('3', (10, 10), 'i')
d3_arr = np.ndarray( (1, 10), 'i' )
for row in range(d1.shape[0]) :
np.add(d1[row,:], d2[row,:], out=d3_arr)
d3[row,:] = d3_arr
推荐阅读
- sql - 使用 SQL 将表 B 中的空值替换为表 A 中的值
- gradle - 为什么 gradle jar 不构建 gradle build 的 jar?
- python - 如何基于另一个 DataFrame 为字符串创建标签列?
- javascript - onSnapshot、forEach 和 get() 在 Firebase 上同步
- ignite - 点燃瘦客户端不稳定的行为
- php - 如何在 PHP 中获取用户全名会话数据?
- windows - Qt 多头控制台应用程序在退出时挂起(使用 ctrl-c)
- r - 识别和计算法术(每组中的独特事件)
- android - 如何在 Android Studio 中添加带有函数的单独文件
- c# - 连接到 docker 容器中的 SQL Server 时出错