最大化两个 numpy 数组之间的成对匹配的排序
假设我们有两个一维 numpy 数组 v1
和 v2
。数组的长度相等。在这种情况下,数组的数据类型是“
我想编写函数 get_maximum_match_order
:
将
v1
和v2
作为输入。返回一个索引数组,然后可用于重新排序
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
andv2
as inputs.Returns an index array that can be then used to re-order
v2
. The re-orderedv2
should then have maximal pair-wise matches withv1
.
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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
只需找到对并对齐它们,然后分发休息元素(索引)您喜欢的任何方式即可。
Just find pairs and align them and then distribute rest elements (indexes) any way you like.