为方便起见,我有两个一维数组,我们会调用x
和y
:
x = np.array([1., 3.])
y = np.array([2, 4])
我希望将它们连接成结构化数组。所需的输出是:
array([( 1., 2), ( 3., 4)],
dtype=[('x', '<f8'), ('y', '<i8')])
但是这样做:
my_array = np.array([x, y]).T
my_array = my_array.astype([('x', float), ('y', int)])
我得到以下内容:
array([[( 1., 1), ( 2., 2)],
[( 3., 3), ( 4., 4)]],
dtype=[('x', '<f8'), ('y', '<i8')])
答案 0 :(得分:3)
您可以使用np.rec.fromarrays
:
np.rec.fromarrays([x, y], dtype=[('x', '<f8'), ('y', '<i8')])
# rec.array([( 1., 2), ( 3., 4)],
# dtype=[('x', '<f8'), ('y', '<i8')])
答案 1 :(得分:0)
Converting a 2D numpy array to a structured array并不重复。起点是
[("Hello",2.5,3),("World",3.6,2)]
接受的解决方案使用np.rec.fromarrays
,但它必须转置输入。简短的解决方案使用np.fromrecords
。
但是查看fromarrays
的代码提示了一种简单的方法,特别是如果您无法回想起所有这些recarray
函数隐藏的位置。
In [200]: x = np.array([1., 3.])
...: y = np.array([2, 4])
In [201]: dt = [('x', '<f8'), ('y', '<i8')]
In [204]: arr = np.empty(x.shape[0], dtype=dt)
In [205]: for n, v in zip(arr.dtype.names, [x, y]):
...: arr[n] = v
In [206]: arr
Out[206]:
array([( 1., 2), ( 3., 4)],
dtype=[('x', '<f8'), ('y', '<i8')])
与许多recfunctions
,fromarrays
一样,创建所需形状和dtype的新空白数组,并按字段名称复制值。
虽然fromrecords
提出了不同的方法 - 使用zip
来转置数组:
In [210]: list(zip(*[x,y]))
Out[210]: [(1.0, 2), (3.0, 4)]
这是一个元组列表,所以我可以直接在结构化数组创建语句中使用它:
In [212]: np.array(_, dtype=dt)
Out[212]:
array([( 1., 2), ( 3., 4)],
dtype=[('x', '<f8'), ('y', '<i8')])
复制字段应该更快,假设真实数组的记录多于字段。