如果行匹配,则将一列添加到一个数组中,该数组的值来自另一个数组中的某个位置

Add a column to an array with values from a position in another array if rows match

我有两个数组,一个是这样的:

[[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]]

您可以使用:

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)