gpt4 book ai didi

python - 从 HDF5 文件读取和写入 numpy 数组

转载 作者:行者123 更新时间:2023-11-30 22:38:17 24 4
gpt4 key购买 nike

我正在构建模拟软件,我需要将(数千个)2D numpy 数组写入 HDF5 文件中的表中,其中数组的一维是可变的。传入的数组是float32类型;为了节省磁盘空间,每个数组都存储为一个表,其中的列具有适当的数据类型(因此不使用数组)。当我读取表格时,我想检索 float32 类型的 numpy.ndarray,这样我就可以进行很好的计算以进行分析。下面是示例代码,其中包含包含物种 A、B 和 C 以及时间的数组。

我目前阅读和写作的方式“有效”,但速度非常慢。因此,问题是:将 array 快速存储到 table 中,并再次将其读回 ndarrays 的适当方法是什么?我一直在尝试 numpy.recarray,但我无法让它工作(类型错误、尺寸错误、完全错误的数字等)?

代码:

import tables as pt
import numpy as np

# Variable dimension
var_dim=100

# Example array, rows 0 and 3 should be stored as float32, rows 1 and 2 as uint16
array=(np.random.random((4, var_dim)) * 100).astype(dtype=np.float32)

filename='test.hdf5'
hdf=pt.open_file(filename=filename,mode='w')
group=hdf.create_group(hdf.root,"group")

particle={
'A':pt.Float32Col(),
'B':pt.UInt16Col(),
'C':pt.UInt16Col(),
'time':pt.Float32Col(),
}
dtypes=np.array([
np.float32,
np.uint16,
np.uint16,
np.float32
])

# This is the table to be stored in
table=hdf.create_table(group,'trajectory', description=particle, expectedrows=var_dim)

# My current way of storing
for i, row in enumerate(array.T):
table.append([tuple([t(x) for t, x in zip(dtypes, row)])])
table.flush()
hdf.close()


hdf=pt.open_file(filename=filename,mode='r')
array_table=hdf.root.group._f_iter_nodes().__next__()

# My current way of reading
row_list = []
for i, row in enumerate(array_table.read()):
row_list.append(np.array(list(row)))

#The retreived array
array=np.asarray(row_list).T


# I've tried something with a recarray
rec_array=array_table.read().view(type=np.recarray)

# This gives me errors, or wrong results
rec_array.view(dtype=np.float64)
hdf.close()

我得到的错误:

Traceback (most recent call last):
File "/home/thomas/anaconda3/lib/python3.6/site-packages/numpy/core/records.py", line 475, in __setattr__
ret = object.__setattr__(self, attr, val)
ValueError: new type not compatible with array.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/home/thomas/Documents/Thesis/SO.py", line 53, in <module>
rec_array.view(dtype=np.float64)
File "/home/thomas/anaconda3/lib/python3.6/site-packages/numpy/core/records.py", line 480, in __setattr__
raise exctype(value)
ValueError: new type not compatible with array.
Closing remaining open files:test.hdf5...done

最佳答案

作为一种快速而肮脏的解决方案,可以通过暂时将数组转换为列表来避免循环(如果您可以节省内存)。由于某些原因,记录数组很容易与列表相互转换,但不能与传统数组相互转换。

存储:

table.append(array.T.tolist())

加载中:

loaded_array = np.array(array_table.read().tolist(), dtype=np.float64).T

应该有一种更“Numpythonic”的方法来在记录数组和常规数组之间进行转换,但我对前者不够熟悉,不知道如何进行转换。

关于python - 从 HDF5 文件读取和写入 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43635362/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com