将ndarray存储在PyTable中(以及如何定义Col()-类型)

2024-04-20 00:30:51 发布

您现在位置:Python中文网/ 问答频道 /正文

TL;DR:我有一个带有float32列的PyTable,在向其中写入numpy-float32-array时出错。(如何)在PyTables表的列中存储numpy数组(float32)?


我是PyTables的新手——根据TFtables(Tensorflow中使用HDF5的一个库)的建议,我将使用它在一个单独的HDF5文件中存储我所有的HDF5数据(当前以多个文件的形式分批分发,每个文件包含三个数据集)。数据集是

'data' : (n_elements, 1024, 1024, 4)@float32
'label' : (n_elements, 1024, 1024, 1)@uint8
'weights' : (n_elements, 1024, 1024, 1)@float32

其中n_elements分布在多个文件中,我现在想将它们合并成一个文件(以允许无序访问)。在

所以当我构建表时,我认为每个数据集代表一个列。我以一种通用的方式构建了所有东西,允许对任意数量的数据集执行此操作:

^{pr2}$

我为每个数据集(使用h5py读取)获取的数据类型显然是读取数据集返回的numpy数组(ndarray)中的一个:float32或{}。所以Col()-类型是Float32ColUInt8Col。我天真地假设现在可以将float32数组写入此列,但是用以下内容填充数据:

dummy_data = np.zeros([1024,1024,3], float32) # normally data read from other files

sample = table.row
sample['data'] = dummy_data

结果是TypeError: invalid type (<class 'numpy.ndarray'>) for column ``data``。所以现在我觉得自己很愚蠢,因为我可以在里面写一个数组,但是没有提供“ArrayCol()”类型,PyTables doc中也没有任何关于是否可以或如何将数组写入列的提示。我该怎么做?在

Col()类及其子类中有“shape”参数,因此应该是可能的,否则这些参数是用来做什么的?!在


Tags: 文件数据samplenumpy类型data参数col
1条回答
网友
1楼 · 发布于 2024-04-20 00:30:51

编辑:我刚刚看到,tables.Col.from_type(type, shape)允许使用类型的精度(float32而不是float单独使用)。其余部分保持不变(采用字符串和形状)。在


工厂函数tables.Col.from_kind(kind, shape)可用于构造支持ndarray的Col类型。什么是“kind”以及如何使用它在我找到的任何地方都没有文档记录;但是通过反复试验,我发现允许的“kind”是基本数据类型的字符串。一、 例:'float''uint'。。。没有精度(不是'float64'

自从我得到numpy.d类型从h5py读取一个数据集(dset.dtype),这些数据必须转换为str,并且精度需要去除。 最后,相关行如下所示:

# get key, dtype and shapes of elements per dataset from the datasource files
val_keys, dtypes, element_shapes = _get_dtypes(datasources, element_axis=element_axis)

# for storing arrays in columns apparently one has to use "kind"
# "kind" cannot be created with dtype but only a string representing 
# the dtype w/o precision, e.g. 'float' or 'uint' 
dtypes_kind = [''.join(i for i in str(dtype) if not i.isdigit()) for dtype in dtypes]

# create table description as dictionary
description = {val_keys[i]: tables.Col.from_kind(dtypes_kind[i], shape=element_shapes[i]) for i in range(len(val_keys))}

然后,将数据写入表中,最终如建议的那样工作:

^{pr2}$

因为这一切都让人觉得有点“老套”,而且没有很好的文档记录,所以我仍然在想,这是否不是PyTables的预期用途,是否会让abit来回答这个问题,看看s.o.是否对此有更多的了解。。。在

相关问题 更多 >