Arrays 将PyTables/HDF5文件中的所有数组从float64转换为float32

Arrays 将PyTables/HDF5文件中的所有数组从float64转换为float32,arrays,numpy,hdf5,pytables,h5py,Arrays,Numpy,Hdf5,Pytables,H5py,我有一个包含大量子目录的PyTables文件。我有一种遍历表中所有数组数据类型的方法。他们是64人;我想在将所有数据点从float64转换为float32的同时,就地转换文件 ,覆盖数组的一种方法是赋值。我有以下代码段,它尝试在表中获取此“count”值/数组,将其转换为float32,并将其分配回表: import h5py import numpy as np # filehead is a string for a file with h5py.File(filehead, 'r+')

我有一个包含大量子目录的PyTables文件。我有一种遍历表中所有数组数据类型的方法。他们是64人;我想在将所有数据点从float64转换为float32的同时,就地转换文件

,覆盖数组的一种方法是赋值。我有以下代码段,它尝试在表中获取此“count”值/数组,将其转换为float32,并将其分配回表:

import h5py
import numpy as np

# filehead is a string for a file
with h5py.File(filehead, 'r+') as f:
    # Lots of stuff here ... e.g. `head` is a string

    print("/obsnorm/Standardizer/count {}".format(f[head+'/obsnorm/Standardizer/count']))
    print("count value: {}".format(f[head+'/obsnorm/Standardizer/count'].value))
    f[head+'/obsnorm/Standardizer/count'][...] = (f[head+'/obsnorm/Standardizer/count'].value).astype('float32')
    print("/obsnorm/Standardizer/count {}".format(f[head+'/obsnorm/Standardizer/count']))
    print("count value: {}".format(f[head+'/obsnorm/Standardizer/count'].value))
不幸的是,打印的结果是:

/obsnorm/Standardizer/count <HDF5 dataset "count": shape (), type "<f8">
count value: 512364.0
/obsnorm/Standardizer/count <HDF5 dataset "count": shape (), type "<f8">
count value: 512364.0
/obsnorm/standarizer/count
计数值:512364.0
/obsnorm/标准化器/计数
计数值:512364.0
换句话说,在赋值之前,计数的类型是f8或float64。强制转换后,类型仍然是float64


我如何在适当的地方修改它,使数据真正理解为float32?

正如hpaulj在评论中建议的那样,我决定简单地重新创建一个重复的HDF5文件,除了创建类型为
f4
(与float32相同)的数据集之外,并且我能够实现我的编码目标

伪代码如下所示:

import h5py
import numpy as np

# Open the original file jointly with new file, with `float32` at the end.
with h5py.File(oldfile, 'r') as f, h5py.File(newfile[:-3]+'_float32.h5', 'w') as newf:
    # `head` is some directory structure
    # Create groups to follow the same directory structure
    newf.create_group(head)

    # When it comes time to create a dataset, make the cast here.
    newdata = (f[head+'/name_here'].value).astype('float32')
    newf.create_dataset(head+'/name_here', data=newdata, dtype='f4')

    # Proceed for all other datasets.

您的链接使您清楚地知道,只有在形状相同的情况下才能覆盖数据;否则,您需要创建一个新的数据集。这同样适用于
dtype
。要更改
dtype
您必须在此文件或新文件中创建一个新的数据集。我明白了,这是有意义的。我想我希望h5py有一个内部方法可以进行这种转换。但是我可以找出如何制作新的数据集。你可以浏览基本的
HDF5
代码和文档(C++等等)。