最大化两个 numpy 数组之间的成对匹配的排序

发布于 2025-01-18 21:06:36 字数 2613 浏览 0 评论 0原文

假设我们有两个一维 numpy 数组 v1v2。数组的长度相等。在这种情况下,数组的数据类型是“

我想编写函数 get_maximum_match_order

  • v1v2 作为输入。

  • 返回一个索引数组,然后可用于重新排序v2。重新排序的 v2 应该与 v1 具有最大的成对匹配。

示例案例:

案例 1

这里的数组已经完全匹配,因此顺序将是中性的。应用订单后,v2 将保持不变。


v1 = np.array(['A', 'B', 'C'])

v2 = np.array(['A', 'B', 'C'])

order = get_maximum_match_order(v1, v2)

订单 -> np.array([0, 1, 2])

v2[order] -> np.array(['A', 'B', 'C']

情况 2

在这种情况下,两个数组中都不存在所有项目。在将订单应用于 v2 后,项目 'A' 和 'B' 将匹配


v1 = np.array(['A', 'C', 'B'])

v2 = np.array(['B', 'A', 'E'])

order = get_maximum_match_order(v1, v2)

order -> np.array([1, 2, 0])

v2[order] -> np.array([ '一个', 'E', 'B'])

情况 3


v1 = np.array(['A', 'B', 'C'])

v2 = np.array(['C', 'B', 'A'])

order = get_maximum_match_order(v1, v2)

order -> np.array([2, 1, 0])

v2[order] -> np. array(['A', 'B', 'C'])

情况 4

这里的数组没有任何公共项,因此排序将是中性的


v1 = np.array(['A', 'B', 'C'])

v2 = np.array(['D', 'E', 'F'])

order = get_maximum_match_order(v1, v2)

。 ([0, 1, 2])

v2[order] -> np.array(['D', 'E', 'F'])

案例 5


v1 = np.array(['A', 'B', 'C'])

v2 = np.array(['A', 'C', 'B'])

order = get_maximum_match_order(v1, v2)

order -> np.array([0, 2, 1])

v2[order] -> np.array(['A', 'B', 'C'])

案例 6


v1 = np.array(['A', 'G', 'B'])

v2 = np.array(['B', 'F', 'A'])

order = get_maximum_match_order(v1, v2)

订单-> np.array([2, 1, 0])

v2[order] -> np.array(['A', 'F', 'B']) >

案例7


v1 = np.array(['A', 'G', 'B', 'C', 'E'])

v2 = np.array(['B', 'F', 'A', 'E', 'C'])

order = get_maximum_match_order(v1, v2)

np.array([2, 1, 0, 4, 3])

v2[order] -> np.array(['A', 'F', 'B', 'C', 'E'])

我尝试过使用 numpy 的 intersect1d 进行实验,但未能完美地解决这个问题。

Let's say we have two one-dimensional numpy arrays v1 and v2. The arrays are of equal length. The dtype of the arrays is '<U1' in this case. The two arrays may or may not have common items. In each array, all items are unique.

I want to write function get_maximum_match_order that:

  • Takes v1 and v2 as inputs.

  • Returns an index array that can be then used to re-order v2. The re-ordered v2 should then have maximal pair-wise matches with v1.

Example cases:

Case 1

Here the arrays match each other perfectly already, so the order will be neutral. v2 will remain the same after the order is applied.


v1 = np.array(['A', 'B', 'C'])

v2 = np.array(['A', 'B', 'C'])

order = get_maximum_match_order(v1, v2)

order -> np.array([0, 1, 2])

v2[order] -> np.array(['A', 'B', 'C']

Case 2

In this case all items are not present in both arrays. After the order has been applied to v2, items 'A' and 'B' will match.


v1 = np.array(['A', 'C', 'B'])

v2 = np.array(['B', 'A', 'E'])

order = get_maximum_match_order(v1, v2)

order -> np.array([1, 2, 0])

v2[order] -> np.array(['A', 'E', 'B'])

Case 3


v1 = np.array(['A', 'B', 'C'])

v2 = np.array(['C', 'B', 'A'])

order = get_maximum_match_order(v1, v2)

order -> np.array([2, 1, 0])

v2[order] -> np.array(['A', 'B', 'C'])

Case 4

Here the arrays don't have any common items, so the ordering will be neutral.


v1 = np.array(['A', 'B', 'C'])

v2 = np.array(['D', 'E', 'F'])

order = get_maximum_match_order(v1, v2)

order -> np.array([0, 1, 2])

v2[order] -> np.array(['D', 'E', 'F'])

Case 5


v1 = np.array(['A', 'B', 'C'])

v2 = np.array(['A', 'C', 'B'])

order = get_maximum_match_order(v1, v2)

order -> np.array([0, 2, 1])

v2[order] -> np.array(['A', 'B', 'C'])

Case 6


v1 = np.array(['A', 'G', 'B'])

v2 = np.array(['B', 'F', 'A'])

order = get_maximum_match_order(v1, v2)

order -> np.array([2, 1, 0])

v2[order] -> np.array(['A', 'F', 'B'])

Case 7


v1 = np.array(['A', 'G', 'B', 'C', 'E'])

v2 = np.array(['B', 'F', 'A', 'E', 'C'])

order = get_maximum_match_order(v1, v2)

order -> np.array([2, 1, 0, 4, 3])

v2[order] -> np.array(['A', 'F', 'B', 'C', 'E'])

I've tried experimenting with numpy's intersect1d but haven't been able to nail this down perfectly.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

伤感在游骋 2025-01-25 21:06:36

只需找到对并对齐它们,然后分发休息元素(索引)您喜欢的任何方式即可。

from contextlib import suppress
import numpy as np

def index(vs, v):
    with suppress(IndexError):
        return np.where(vs == v)[0][0]

def get_maximum_match_order(v1, v2):
    ixs = [index(v1, v) for v in v2]
    it = iter(set(range(len(v1))) - set(ixs))
    return np.array([next(it) if ix is None else ix for ix in ixs])

if __name__ == "__main__":
    v1 = np.array(['A', 'G', 'B', 'C', 'E'])
    v2 = np.array(['B', 'F', 'A', 'E', 'C'])
    print(get_maximum_match_order(v1, v2))

Just find pairs and align them and then distribute rest elements (indexes) any way you like.

from contextlib import suppress
import numpy as np

def index(vs, v):
    with suppress(IndexError):
        return np.where(vs == v)[0][0]

def get_maximum_match_order(v1, v2):
    ixs = [index(v1, v) for v in v2]
    it = iter(set(range(len(v1))) - set(ixs))
    return np.array([next(it) if ix is None else ix for ix in ixs])

if __name__ == "__main__":
    v1 = np.array(['A', 'G', 'B', 'C', 'E'])
    v2 = np.array(['B', 'F', 'A', 'E', 'C'])
    print(get_maximum_match_order(v1, v2))

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文