【问题标题】:NumPy equivalent of mergeNumPy 相当于合并
【发布时间】:2018-03-26 15:36:26
【问题描述】:

我正在将一些东西从 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?大多数人使用 pandas 来匹配 R 的功能。 pd.merge
  • 我并不反对使用 pandas,但是我认为在 pandas 和 numpy 之间进行交换(因为我计划稍后使用 numpy 进行操作)效率低下。不过,我在这里可能是错的。
  • 我会为 Pandas 的建议 +1。 Pandas DataFrames 构建在 NumPy 数组之上。 Pandas 最适合您问题中描述的操作,您可以随时使用 df.values 访问 Pandas DataFrame df 的底层 Numpy 数组。

标签: python numpy merge


【解决方案1】:

这是一个使用掩码的基于 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:]]

示例运行 -

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

我们也可以使用broadcasting 来获取索引,然后用整数索引代替掩码,就像这样 -

idx = np.argwhere(d1[:,0,None] == d2[:,0])
out = np.c_[d1[idx[:,0]], d2[idx[:,0,1:]

【讨论】:

    猜你喜欢
    • 2022-07-31
    • 2012-05-21
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 2021-07-25
    • 2011-03-13
    相关资源
    最近更新 更多