相交Numpy 2d阵列的行

时间:2017-07-30 23:05:44

标签: python arrays numpy

我需要得到主numpy 2d数组A的交叉行的索引,另外3个数组B,C和D,并返回另一个数组E和索引 例如:

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

B = array([[2,3],
           [4,3],
           [3,5]])

C = array([[3,4],
           [3,5],
           [5,6]])

D = array([[4,2],
           [5,4],
           [6,3]])
RESULT ARRAY:
[[1, 3, -2],
 [-3, 4, -6],
 [4, 7, -5]]

请注意,当列反转时,indice的结果必须假设( - )

例如,交叉A和B:

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

B = array([[2,3],
           [4,3],
           [3,5]])

RESULT ARRAY:
[1, -3, 4]

将行B:[4,3]与A:[3,4]相交,返回结果-3,因为相交的行是反转的

谢谢!

4 个答案:

答案 0 :(得分:2)

如果将数组转换为元组的记录数组,则可以使用in1d的魔法来执行此操作。

def get_indices(a, b):
    # Convert to arrays if needed
    a = np.asarray(a)
    b = np.asarray(b)

    dtype = 'int, int'

    # Get the indices
    forward = np.in1d(a.view(dtype), b.view(dtype))
    backward = np.in1d(a[:, ::-1].copy().view(dtype), b.view(dtype))

    # Compute formatting as requested
    sign = forward.astype(int) - backward.astype(int)
    value = forward | backward
    indices = np.where(value)[0]
    return indices * sign[indices]

使用此功能,您可以为每个数组调用它以获得结果:

>>> np.hstack([get_indices(A, b)[:, None] for b in [B, C, D]])
array([[ 1,  3, -2],
       [-3,  4, -5],
       [ 4,  7, -6]], dtype=int64)

答案 1 :(得分:0)

将A的所有元素放入字典中,其中键是行(作为元组),值是行的索引。然后迭代B,C,D行,使用字典查找A的索引。

A = [[1,1],
     [2,3],
     [2,4],
     [3,4],
     [3,5],
     [3,6],
     [4,5],
     [5,6]]

B = [[2,3],
     [4,3],
     [3,5]]

C = [[3,4],
     [3,5],
     [5,6]]

D = [[4,2],
     [5,4],
     [6,3]]

A_dict = {tuple(pair): i for i, pair in enumerate(A)}
A_dict.update({(pair[1], pair[0]): -i for i, pair in enumerate(A)})

result_array = []
for arr in [B, C, D]:
  result_array.append([A_dict[tuple(pair)] for pair in arr])

print result_array

答案 2 :(得分:0)

我的建议......

def search(Array,Main):
    lst = []
    for row in Array:
        mtc = np.where((Main == row).all(axis=1))[0]
        if len(mtc) == 0:
            mtc = np.where((np.flip(A,1) == row).all(axis=1))[0] * -1
        lst.append(mtc)
    return np.array(lst)

arrays = [search(x,A) for x in [B,C,D]]

print np.hstack(arrays)

为您提供阵列

[[ 1  3 -2]
 [-3  4 -6]
 [ 4  7 -5]]

答案 3 :(得分:0)

另一个想法: 请注意,我使用列表而不是数组,因此使用.tolist()

进行转换
def intersect(A, Blist):
    A, Blist = A.tolist(), [B.tolist() for B in Blist]
    return np.transpose( [[A.index(l) if l in A else -A.index([l[1], l[0]]) for l in L] for L in Blist] )

这会产生

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

代表

intersect(A, [B, C, D])