考虑一个由元素对组成的数组 M。 (我使用空格来强调我们将处理元素对)。实际的数组将有大量的行和 4、6、8 或 10 列。
import numpy as np
M = np.array([[1,3, 2,1, 4,2, 3,3],
[3,5, 6,9, 5,1, 3,4],
[1,3, 2,4, 3,4, 7,2],
[4,5, 1,2, 2,1, 2,3],
[6,4, 4,1, 6,1, 4,7],
[6,7, 7,6, 9,7, 6,2],
[5,3, 1,5, 3,3, 3,3]])
问题:我想从 M 中消除具有元素对的行,该元素对与该行中的任何其他对没有共同元素。
在数组 M 中,应消除第 2 行和第 4 行。原因如下:
第二行:对 (6,9) 与 (3,5)、(5,1) 或 (3,4) 没有共同元素
第四行:对 (4,5) 与 (1,2)、(2,1) 或 (2,3) 没有共同元素
我确信有一个很好的广播解决方案,但我看不到它。
最佳答案
这是一个广播解决方案。希望它是不言自明的:
a = M.reshape(M.shape[0],-1,2)
mask = ~np.eye(a.shape[1], dtype=bool)[...,None]
is_valid = (((a[...,None,:]==a[:,None,...])&mask).any(axis=(-1,-2))
|((a[...,None,:]==a[:,None,:,::-1])&mask).any(axis=(-1,-2))
).all(-1)
M[is_valid]
输出:
array([[1, 3, 2, 1, 4, 2, 3, 3],
[1, 3, 2, 4, 3, 4, 7, 2],
[6, 4, 4, 1, 6, 1, 4, 7],
[6, 7, 7, 6, 9, 7, 6, 2],
[5, 3, 1, 5, 3, 3, 3, 3]])
关于python - 消除不满足匹配条件的数组行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64813728/