【发布时间】:2020-05-30 14:46:05
【问题描述】:
我有两个非结构化 NumPy 数组 a 和 b,形状分别为 (N,) 和 (N, 256, 2),dtype np.float。我希望将这些组合成一个具有形状的结构化数组(N,) 和 dtype [('field1', np.float), ('field2', np.float, (256, 2))]。
这方面的文档令人惊讶地缺乏。我找到了 np.lib.recfunctions.merge_arrays 之类的方法,但无法找到执行此操作所需的精确功能组合。
为了避免the XY problem,我将陈述我更广泛的目标。
我有一个布局为{"field1": tables.FloatCol(), "field2": tables.FloatCol(shape = (256, 2))} 的 PyTables 表。这两个 NumPy 数组表示要附加到每个字段的 N 行新行。 N 很大,所以我希望通过一个有效的table.append(rows) 调用来做到这一点,而不是循环通过table.row['field'] = ... 的缓慢过程。
The table.append documentation 说
rows 参数可以是任何可以转换为符合表结构的结构化数组的对象(否则会引发 ValueError)。这包括 NumPy 结构化数组、元组列表或数组记录,以及字符串或 Python 缓冲区。
将我的数组转换为适当的结构化数组似乎是我应该在这里做的。我正在寻找速度,我预计其他选项会更慢。
【问题讨论】:
-
我不确定这个问题是用 NumPy 问题还是 PyTables 问题来表述最好。我选择了 NumPy 问题,因为它似乎更普遍适用并且需要较少的专业知识来回答。一个人可能能够在不了解 PyTables 的情况下回答 NumPy 问题,但反之则不行。如果人们认为我打错了电话,我愿意编辑问题以改变重点。
-
创建一个具有正确形状和数据类型的
np.zeros结构化数组,并按名称单独分配字段。 -
啊!当你说@hpaulj时,这很明显!我有点太快地阅读了有关结构化数组的文档,并意识到根本不可能按字段对它们进行切片,但这很有效。我想我在某个地方读到了一些过时的东西。当然,我们可以使用
np.empty代替np.zeros。如果您想用最少的代码示例将此作为答案发布,我很乐意接受。 -
最近的版本对多字段访问做了改动;否则创建结构化数组保持不变。
标签: python numpy numpy-ndarray pytables