我试图将两个用这种形式创建的数组连接起来。
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数组。
你可以使用 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)