我正在将一些东西从 R 过渡到 Python,并且对有效合并感到好奇。我在 NumPy 中发现了一些关于 concatenate
的东西(使用 NumPy 进行操作,所以我想坚持使用它),但它没有按预期工作。
取两个数据集
d1 = np.array([['1a2', '0'], ['2dd', '0'], ['z83', '1'], ['fz3', '0']])
ID Label
1a2 0
2dd 0
z83 1
fz3 0
和
d2 = np.array([['1a2', '33.3', '22.2'],
['43m', '66.6', '66.6'],
['z83', '12.2', '22.1']])
ID val1 val2
1a2 33.3 22.2
43m 66.6 66.6
z83 12.2 22.1
我想将它们合并在一起,这样结果是
d3
ID Label val1 val2
1a2 0 33.3 22.2
z83 1 12.2 22.1
因此它识别出与 ID 列匹配的行,然后将它们连接在一起。这在 R 中使用 merge
相对简单,但在 NumPy 中它对我来说不太明显。
有没有一种方法可以在 NumPy 中本地执行我所缺少的?
最佳答案
这是一个使用掩码的基于 NumPy 的解决方案 -
def numpy_merge_bycol0(d1, d2):
# Mask of matches in d1 against d2
d1mask = np.isin(d1[:,0], d2[:,0])
# Mask of matches in d2 against d1
d2mask = np.isin(d2[:,0], d1[:,0])
# Mask respective arrays and concatenate for final o/p
return np.c_[d1[d1mask], d2[d2mask,1:]]
sample 运行-
In [43]: d1
Out[43]:
array([['1a2', '0'],
['2dd', '0'],
['z83', '1'],
['fz3', '0']], dtype='|S3')
In [44]: d2
Out[44]:
array([['1a2', '33.3', '22.2'],
['43m', '66.6', '66.6'],
['z83', '12.2', '22.1']], dtype='|S4')
In [45]: numpy_merge_bycol0(d1, d2)
Out[45]:
array([['1a2', '0', '33.3', '22.2'],
['z83', '1', '12.2', '22.1']], dtype='|S4')
我们还可以使用广播
来获取索引,然后使用整数索引代替屏蔽,就像这样-
idx = np.argwhere(d1[:,0,None] == d2[:,0])
out = np.c_[d1[idx[:,0]], d2[idx[:,0,1:]
关于python - NumPy 相当于合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49495344/