设置dtype时Numpy数组上的值重复

时间:2017-06-02 19:38:46

标签: python arrays python-3.x numpy

为方便起见,我有两个一维数组,我们会调用xy

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')])

2 个答案:

答案 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')])

与许多recfunctionsfromarrays一样,创建所需形状和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')])

复制字段应该更快,假设真实数组的记录多于字段。