标识numpy数组中具有给定数量的匹配元素的行

e5nqia27  于 2023-01-09  发布在  其他
关注(0)|答案(1)|浏览(135)

二维numpy数组的属性是每一列都有一个不重叠的整数范围(见下面B),例如,8只能出现在第3列。

b = [[1, 5, 9, 11, 13],
     [1, 6, 8, 10, 14],
     [2, 4, 8, 12, 15],
     [2, 5, 7, 11, 13],
     [3, 4, 9, 10, 15],
     [3, 5, 7, 12, 14]]

我需要知道哪对行有0个匹配元素,1个匹配元素,......,5个匹配元素。在“完美世界”中,输出看起来像下面的数组。行0和0有5个公共元素,行0和1有1个公共元素,等等。

out = [[0, 0, 5],
       [0, 1, 1],
       [0, 2, 0],
       [0, 3, 3],
       ...etc

我的主要问题是如何处理“确切”。

wgeznvg7

wgeznvg71#

我想不出比列表解析更好的方法了,如果每行不包含重复项,可以通过设置assume_unique=True来加快速度。

import numpy as np

b = [[1, 5, 9, 11, 13],
     [1, 6, 8, 10, 14],
     [2, 4, 8, 12, 15],
     [2, 5, 7, 11, 13],
     [3, 4, 9, 10, 15],
     [3, 5, 7, 12, 14]]

out = np.array([
    [i, j, np.intersect1d(b[i], b[j]).size]
    for i in range(N)
    for j in range(N)
])

它应该会给予你期望的输出,虽然我觉得这样更直观:

out = np.array([
    [
        np.intersect1d(rowx, rowy).size
        for rowx in b
    ]
    for rowy in b
])

其给出:

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

相关问题