我有两个非结构化与NumPy阵列a
和b
与形状(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'] = ...
。
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] 删除。
我来说两句