[此帖子的早期版本标题不正确:“如何在一列numpy记录中添加一列?”早先的标题中提出的问题已经部分为answered,但此答案并不完全是该帖子的早先版本所要求的内容.我重新命名了标题,并对其进行了实质性的编辑,以使区别更加清晰.我还解释了为什么我前面提到的答案不符合我的期望.]
假设我有两个numpy数组x和y,每个数组由r个“记录”(又名“结构化”)数组组成.设x的形状为(r,cx),y的形状为(r,cy).我们还假设x.dtype.names和y.dtype.names之间没有重叠.
例如,对于r = 2,cx = 2,cy = 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')])
我想“水平”连接x和y以产生具有形状(r,cx cy)的记录z的新数组.此操作完全不应修改x或y.
通常,z = np.hstack((x,y))不会,因为x和y中的dtype不一定匹配.例如,继续上面的示例:
z = np.hstack((x, y))
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
in ()
----> 1 z = np.hstack((x, y))
TypeError: invalid type promotion
现在,有一个函数numpy.lib.recfunctions.append_fields,看起来它可能会执行与我正在寻找的功能接近的操作,但是我无法从中得到任何帮助:我尝试过的所有操作要么由于错误而失败,要么产生除我尝试获取的以外的内容.
有人可以请我明确显示代码(使用nlrappend_fields或else1),该代码将从上例中定义的x和y生成一个新的记录数组z,等效于x和y的水平串联,并执行所以不修改x或y?
我假设这仅需要一两行代码.当然,我正在寻找不需要构建z的代码,通过遍历x和y可以逐条记录.同样,代码可以假定x和y具有相同的记录数,并且x.dtype.names和y.dtype.names之间没有重叠.除此之外,我正在寻找的代码应该对x和y一无所知.理想情况下,也应该对要连接的数组的数量不了解. IOW,不进行错误检查,我正在寻找的代码可能是函数hstack_rec的主体,以便新数组z将成为结果hstack_rec((x,y)).
1 …虽然我不得不承认,在迄今为止用numpy.lib.recfunctions.append_fields完美记录失败之后,我对如何使用此功能(无论其相关性)感到有点好奇这个帖子的问题