如何连接用dtype创建的元组数组?

问题描述 投票:0回答:1

我试图将两个用这种形式创建的数组连接起来。

data1 = numpy.array([(1,2,3),(4,5,6)], dtype={'names':['a', 'b', 'c'], 'formats':[int, float, float]})
data2 = numpy.array([(11,22),(44,55)], dtype={'names':['d', 'e'], 'formats':[int, float]})

我想用这种形式的东西来结束。

array([(1, 2., 3., 11, 22.), (4, 5., 6., 44, 55.)],
      dtype=[('a', '<i8'), ('b', '<f8'), ('c', '<f8'), ('d', '<i8'), ('e', '<f8')])

我该怎么做?

这段代码几乎让我达到了目的,但我不知道如何连接dtypes。

  m = []
  for i,j in zip(data1, data2):
    print(i,j)
    m.append( (*i,*j) )

额外的问题:

这种操作在pandas中是否更容易?

基本上,我想要的是带有命名字段和类型的数组,我可以很容易地绘制,输出到CSV文件(带头),如果需要的话,我可以很容易地添加额外的列和行。(例如:从其他列中计算出一个新的列,从另一个数据集中添加行)

如果需要的话,我愿意修改我的代码,用不同的方式来制作数组,但还是想知道如何处理这些dtype数组。

python numpy dtype
1个回答
1
投票

你可以使用 numpy.lib.recfunctions 按照评论中的建议。

import numpy.lib.recfunctions as rfn

arrays = [data1, data2]

m = rfn.merge_arrays(arrays, flatten = True)

产出:

m:

[(1, 2., 3., 11, 22.) (4, 5., 6., 44, 55.)]

m.dtype:

[('a', '<i8'), ('b', '<f8'), ('c', '<f8'), ('d', '<i8'), ('e', '<f8')]

UPDATE: 如果数据1和数据2有共同的字段。

common_fields = set(data1.dtype.names).intersection(set(data2.dtype.names))

#remove common fields from data1 (simply change to data2 if you wish to remove from data2)
data1 = data1[[name for name in data1.dtype.names if name not in common_fields]]

arrays = [data1, data2]
m = rfn.merge_arrays(arrays, flatten = True)
© www.soinside.com 2019 - 2024. All rights reserved.