numpy 消除不符合匹配条件的数组行

ubby3x7f  于 2023-01-13  发布在  其他
关注(0)|答案(2)|浏览(165)

考虑一个数组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行应该被删除,原因如下:

**第2行:**元素对(6,9)与元素(3,5)、(5,1)或(3,4)没有公共元素
**第4行:**对(4,5)与(1,2)、(2,1)或(2,3)没有公共元素

我相信有一个很好的广播解决方案,但我看不到它。

lmvvr0a8

lmvvr0a81#

这是一个广播解决方案。希望它是自我解释:

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]])
anhgbhbe

anhgbhbe2#

另一个解决办法是-

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

MM = M.reshape(M.shape[0],-1,2)

matches_M = np.any(MM[:,:,None,:,None] == MM[:,None,:,None,:], axis=(-1,-2))
mask = ~np.eye(MM.shape[1], dtype=bool)[None,:]

is_valid = np.all(np.any(matches_M&mask, axis=-1), axis=-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]])

相关问题