如何对Numpy记录的数组进行hstack?

kjo*_*kjo 3 python numpy recarray

[此帖子的早期版本标题不正确:“如何在一列numpy记录中添加一列?” 问的问题在标题前面已经部分回答了,但这个答案是不太什么身体的这个帖子较早版本要求。我重新命名了标题,并对其进行了实质性的编辑,以使区别更加清晰。我还解释了为什么我前面提到的答案不符合我的期望。]


假设我有两个numpy数组xy,每个数组由r个 “ record”(也称为“结构化”)数组组成。设xbe 的形状为(rc x)和ybe 的形状为(rc y)。我们还假设x.dtype.names和之间没有重叠y.dtype.names

例如,对于r = 2,c x = 2,c y = 1:

import numpy as np
x = np.array(zip((1, 2), (3., 4.)), dtype=[('i', 'i4'), ('f', 'f4')])
y = np.array(zip(('a', 'b')), dtype=[('s', 'a10')])
Run Code Online (Sandbox Code Playgroud)

我想“水平”连接xy产生形状为(rc x + c y)的记录数组。此操作不应该修改或根本不修改。zxy

通常,z = np.hstack((x, y))不会这样做,因为dtypein xy不一定匹配。例如,继续上面的示例:

z = np.hstack((x, y))
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-7-def477e6c8bf> in <module>()
----> 1 z = np.hstack((x, y))
TypeError: invalid type promotion
Run Code Online (Sandbox Code Playgroud)


现在,有一个功能,numpy.lib.recfunctions.append_fields看起来像它可以做一些接近我正在寻找,但我一直没能得到任何东西出来的:一切,我已经与它要么尝试失败,出现错误,或者产生的东西不是我想要得到的。

有人可以请我明确地显示代码(使用n.l.r.append_fields或以其他方式1),该代码将根据上述示例中的xy定义生成一个的记录数组z,等效于和的水平连接,xy无需修改xor即可y

我假设这仅需要一两行代码。当然,我正在寻找不需要构建z,逐条记录,遍历xand的代码y。此外,该代码可以假设xy具有相同数量的记录,并且存在之间不存在重叠x.dtype.namesy.dtype.names。除此之外,我正在寻找的代码应该不了解xy。理想情况下,也应该对要连接的数组的数量不了解。IOW,省去了错误检查,我正在寻找的代码可能是函数的主体,hstack_rec因此新数组z将是result hstack_rec((x, y))


1 ...虽然我不得不承认,在我与失败的这么远完美的纪录numpy.lib.recfunctions.append_fields,我已经变得有点好奇如何函数可用于在所有的,不论其相关的这个职位的问题。

DSM*_*DSM 5

我从不使用recarrays,所以其他人会想出些许技巧,但是也许merge_arrays行得通吗?

>>> import numpy.lib.recfunctions as nlr
>>> x = np.array(zip((1, 2), (3., 4.)), dtype=[('i', 'i4'), ('f', 'f4')])
>>> y = np.array(zip(('a', 'b')), dtype=[('s', 'a10')])
>>> x
array([(1, 3.0), (2, 4.0)], 
      dtype=[('i', '<i4'), ('f', '<f4')])
>>> y
array([('a',), ('b',)], 
      dtype=[('s', '|S10')])
>>> z = nlr.merge_arrays([x, y], flatten=True)
>>> z
array([(1, 3.0, 'a'), (2, 4.0, 'b')], 
      dtype=[('i', '<i4'), ('f', '<f4'), ('s', '|S10')])
Run Code Online (Sandbox Code Playgroud)