【问题标题】:Add a column to an array with values from a position in another array if rows match如果行匹配,则将列添加到具有来自另一个数组中某个位置的值的数组
【发布时间】:2021-12-24 20:44:40
【问题描述】:

我有两个数组,一个看起来像这样:

[[1 2 1 0 2 0 1]
[1 2 1 0 2 0 1]
[1 2 1 0 2 0 1]
[1 2 1 0 2 0 1]
[0 1 2 1 0 0 2]
[0 1 2 1 0 0 2]
[0 0 1 0 1 0 3]
[0 0 0 1 1 0 4]
[0 0 0 0 1 0 5]
[0 0 0 0 0 1 6]]

另一个是这样的:

[[1 2 1 0 2 0]
[1 1 1 0 2 0]
[1 1 1 0 2 0]
[1 2 1 0 2 0]
[0 3 2 2 0 0]
[0 1 2 1 0 0]
[0 2 1 2 1 0]
[0 0 0 1 1 0]
[0 0 0 0 1 0]
[0 0 0 0 0 1]
     ...
 [0 3 2 2 0 0]
[0 1 2 1 0 0]
[0 2 1 2 1 0]
[0 0 0 1 1 0]
[0 0 0 0 1 0]
[0 0 0 0 0 1]]

每当第二个数组中的一行与第一个数组中的前六个值匹配时,我需要将第一个数组的最后一个元素(第 7 个元素)添加到匹配的第二个数组行的末尾以及何时匹配不匹配添加 0。结果如下所示:

[[1 2 1 0 2 0 1]
[1 1 1 0 2 0 0]
[1 1 1 0 2 0 0]
[1 2 1 0 2 0 1]
[0 3 2 2 0 0 0]
[0 1 2 1 0 0 2]
[0 2 1 2 1 0 0]
[0 0 0 1 1 0 4]
[0 0 0 0 1 0 5]
[0 0 0 0 0 1 6]
     ...
[0 3 2 2 0 0 0]
[0 1 2 1 0 0 2]
[0 2 1 2 1 0 0]
[0 0 0 1 1 0 4]
[0 0 0 0 1 0 5]
[0 0 0 0 0 1 6]]

【问题讨论】:

    标签: arrays numpy matrix numpy-slicing


    【解决方案1】:

    你可以使用:

    import numpy as np
    m = (B == A[:,None,:6]).all(2)
    new_A = np.c_[B, np.where(m.any(0), np.take(A[:,6], m.argmax(0)), 0)]
    

    它是如何工作的:

    1-使用广播将B与A的所有行组合(限于前6列)进行比较,并构建一个掩码

    2- 使用numpy.where检查条件:如果A中至少有1行匹配,使用numpy.argmax获取第一个匹配的索引,numpy.take从A的最后一列获取值。否则,分配 0。

    3- 连接 B 和新建的列

    输出:

    array([[1, 2, 1, 0, 2, 0, 1],
           [1, 1, 1, 0, 2, 0, 0],
           [1, 1, 1, 0, 2, 0, 0],
           [1, 2, 1, 0, 2, 0, 1],
           [0, 3, 2, 2, 0, 0, 0],
           [0, 1, 2, 1, 0, 0, 2],
           [0, 2, 1, 2, 1, 0, 0],
           [0, 0, 0, 1, 1, 0, 4],
           [0, 0, 0, 0, 1, 0, 5],
           [0, 0, 0, 0, 0, 1, 6],
           [0, 3, 2, 2, 0, 0, 0],
           [0, 1, 2, 1, 0, 0, 2],
           [0, 2, 1, 2, 1, 0, 0],
           [0, 0, 0, 1, 1, 0, 4],
           [0, 0, 0, 0, 1, 0, 5],
           [0, 0, 0, 0, 0, 1, 6]])
    

    输入:

    A = [[1, 2, 1, 0, 2, 0, 1],
         [1, 2, 1, 0, 2, 0, 1],
         [1, 2, 1, 0, 2, 0, 1],
         [1, 2, 1, 0, 2, 0, 1],
         [0, 1, 2, 1, 0, 0, 2],
         [0, 1, 2, 1, 0, 0, 2],
         [0, 0, 1, 0, 1, 0, 3],
         [0, 0, 0, 1, 1, 0, 4],
         [0, 0, 0, 0, 1, 0, 5],
         [0, 0, 0, 0, 0, 1, 6]]
    A = np.array(A)
     
    B = [[1, 2, 1, 0, 2, 0],
         [1, 1, 1, 0, 2, 0],
         [1, 1, 1, 0, 2, 0],
         [1, 2, 1, 0, 2, 0],
         [0, 3, 2, 2, 0, 0],
         [0, 1, 2, 1, 0, 0],
         [0, 2, 1, 2, 1, 0],
         [0, 0, 0, 1, 1, 0],
         [0, 0, 0, 0, 1, 0],
         [0, 0, 0, 0, 0, 1],
         [0, 3, 2, 2, 0, 0],
         [0, 1, 2, 1, 0, 0],
         [0, 2, 1, 2, 1, 0],
         [0, 0, 0, 1, 1, 0],
         [0, 0, 0, 0, 1, 0],
         [0, 0, 0, 0, 0, 1]]
    B = np.array(B)
    

    【讨论】:

    • 非常感谢您的回答,这是最后一块拼图。但是,您能否将最终数组分配给这样的变量: r = np.c_[B, np.where(m.any(0), np.take(A[:,6], m.argmax(0) ), 0)] 这是因为我不确定输出是新数组还是 m 的修改就地版本。
    • @Gus 输出是一个新数组;)
    • 现在我知道输出是一个新数组,但我认为如果你给这个数组一个字母,你的答案会更清楚。这适用于像我这样的其他人,他们还不知道您的命令是新数组还是修改 m 的方法。在最后一个场景中,输出中的数组是 m 而不是一个新数组,但是,由于它是一个新数组以避免混淆,您可以给一个新字母,每个人都会知道不是 m 而是一个全新的数组。当我第一次看到你的答案时,我认为输出数组是 m 所以当我打印 m 结果不匹配时,我意识到我需要分配给 "r"
    猜你喜欢
    • 2021-12-07
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多