如何将列动态分配给PyTables IsDescription类?

2024-04-26 01:48:00 发布

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

假设我有一个PyTables描述类:

In [1]: import tables as tb
        class DataDescr(tb.IsDescription):
            timestamp = tb.Time64Col(pos=0)
            value_b = tb.Float32Col(pos=2)

现在我动态地分配value_a。我需要这样做,因为此列的形状取决于一些用户输入。你知道吗

In [2]: DataDescr.value_a = tb.Float32Col(pos=1, shape=given_shape)

但是当查看使用此描述创建的表时,我看不到新列。你知道吗

In [3]: h5file = tb.open_file('goodstuff.h5', mode='w')
        table = h5file.create_table('/', 'data', DataDescr)
        table
Out[3]: /data (Table(0,)) ''
          description := {
          "timestamp": Time64Col(shape=(), dflt=0.0, pos=0),
          "value_b": Float32Col(shape=(), dflt=0.0, pos=1)}
          byteorder := 'little'
          chunkshape := (5461,)

我怎样才能解决这个问题?你知道吗


Tags: inposimportdatavaluetablepytablestb
1条回答
网友
1楼 · 发布于 2024-04-26 01:48:00

这有几个选项(参见^{})。你知道吗

选项1:使用IsDescription.columns添加类属性

IsDescription对象有一个columns属性,该属性在字典中存储列信息,可用于动态赋值。在问题中,从一个基本完整的类开始。。。你知道吗

class DataDescr(tb.IsDescription):
    timestamp = tb.Time64Col(pos=0)
    value_b = tb.Float32Col(pos=2)

…然后添加缺少的属性。你知道吗

DataDescr.columns['value_a'] = tb.Float32Col(pos=1, shape=(3, 2))

选项2:使用字典描述

与其说是类描述,不如从字典描述开始。。。你知道吗

data_descr = dict(
    timestamp=tb.Float64Col(pos=1),
    value_b=tb.Float32Col(pos=2),
)

…然后在字典中添加一个条目。你知道吗

data_descr['value_a'] = tb.Float32Col(pos=1, shape=(3, 2))

选项3:一次创建NumPy数据类型描述

由于NumPy数据类型不支持项分配,因此此方法要求一次创建所有描述。如果这是一个问题,选项1和2可用。你知道吗

data_descr = np.dtype([
    ('timestamp', np.float64),
    ('value_a', (np.float32, (3, 2))),
    ('value_b', np.float32),
])

[可能很危险]选项4:修改dict条目的形状

我将提到最后一个选项,它不一定得到支持。因此,最好远离这个选项。你知道吗

在开始使用没有指定大小的完整词典之后。。。你知道吗

data_descr = dict(
    timestamp=tb.Float64Col(pos=1),
    value_a=tb.Float32Col(pos=1),
    value_b=tb.Float32Col(pos=2),
)

…修改'value_a'项的形状。你知道吗

data_descr['value_a'].shape = (3, 2)

注意:这不适用于类描述,原因我不知道。

class DataDescr(tb.IsDescription):
    timestamp = tb.Time64Col(pos=0)
    value_a = tb.Float32Col(pos=1)
    value_b = tb.Float32Col(pos=2)

DataDescr.columns['value_a'].shape = (3, 2)

h5file = tb.open_file('goodstuff.h5', mode='w')
table = h5file.create_table('/', 'data', DataDescr)

row = table.row
row['value_a'] = np.ones((3, 2)) * 5
row.append()

结果:

TypeError: invalid type (<class 'numpy.ndarray'>) for column ``value_a``

相关问题 更多 >