将两个 NumPy 数组合并为一个结构化数组以附加到 PyTables 表

山姆

我有两个非结构化与NumPy阵列ab与形状(N,)(N, 256, 2)分别和D型np.float我希望将这些组合成一个具有 shape (N,)和 dtype [('field1', np.float), ('field2', np.float, (256, 2))].

这方面的文档令人惊讶地缺乏。我找到了类似的方法,np.lib.recfunctions.merge_arrays但无法找到执行此操作所需的功能的精确组合。


为了避免XY问题,我将陈述我更广泛的目标。

我有一个带有 layout 的 PyTables 表{"field1": tables.FloatCol(), "field2": tables.FloatCol(shape = (256, 2))}两个 NumPy 数组代表 N 行要附加到这些字段中的每一个。N 很大,所以我希望通过一个有效的table.append(rows)调用来做到这一点,而不是缓慢的循环过程table.row['field'] = ...

table.append文件说:

rows 参数可以是任何可以转换为符合表结构的结构化数组的对象(否则,会引发 ValueError)。这包括 NumPy 结构化数组、元组列表或数组记录,以及字符串或 Python 缓冲区。

将我的数组转换为适当的结构化数组似乎是我应该在这里做的事情。我正在寻找速度,我预计其他选项会更慢。

保利

定义 dtype,并创建一个空/零数组:

In [163]: dt = np.dtype([('field1', np.float), ('field2', np.float, (4, 2))])            
In [164]: arr = np.zeros(3, dt)     # float display is prettier                                                          
In [165]: arr                                                                            
Out[165]: 
array([(0., [[0., 0.], [0., 0.], [0., 0.], [0., 0.]]),
       (0., [[0., 0.], [0., 0.], [0., 0.], [0., 0.]]),
       (0., [[0., 0.], [0., 0.], [0., 0.], [0., 0.]])],
      dtype=[('field1', '<f8'), ('field2', '<f8', (4, 2))])

按字段分配值:

In [166]: arr['field1'] = np.arange(3)                                                   
In [167]: arr['field2'].shape                                                            
Out[167]: (3, 4, 2)
In [168]: arr['field2'] = np.arange(24).reshape(3,4,2)                                   
In [169]: arr                                                                            
Out[169]: 
array([(0., [[ 0.,  1.], [ 2.,  3.], [ 4.,  5.], [ 6.,  7.]]),
       (1., [[ 8.,  9.], [10., 11.], [12., 13.], [14., 15.]]),
       (2., [[16., 17.], [18., 19.], [20., 21.], [22., 23.]])],
      dtype=[('field1', '<f8'), ('field2', '<f8', (4, 2))])

np.rec 确实有一个类似的功能:

In [174]: np.rec.fromarrays([np.arange(3.), np.arange(24).reshape(3,4,2)], dtype=dt)     
Out[174]: 
rec.array([(0., [[ 0.,  1.], [ 2.,  3.], [ 4.,  5.], [ 6.,  7.]]),
           (1., [[ 8.,  9.], [10., 11.], [12., 13.], [14., 15.]]),
           (2., [[16., 17.], [18., 19.], [20., 21.], [22., 23.]])],
          dtype=[('field1', '<f8'), ('field2', '<f8', (4, 2))])

这是一样的,除了字段可以作为属性访问(也可以)。在幕后,它执行相同的按字段分配。

numpy.lib.recfunctions是另一个结构化数组函数的集合。这些也大多遵循按字段分配的方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章