gpt4 book ai didi

python - 查找两个数组之间分组项匹配的索引

转载 作者:行者123 更新时间:2023-11-30 22:31:28 25 4
gpt4 key购买 nike

a = np.array([5,8,3,4,2,5,7,8,1,9,1,3,4,7])
b = np.array ([3,4,7,8,1,3])

我有两个整数列表,每个列表按每 2 个连续项(即索引 [0, 1]、[2, 3] 等)分组。在任一列表中都找不到重复的项目对,无论是相同顺序还是相反顺序。

一个列表明显更大并且包含另一个列表。我正在尝试找出一种有效的方法来获取索引较大列表中也包含在较小列表中的分组项目。

上例中所需的输出应该是:

[2,3,6,7,10,11] #indices

请注意,作为示例,第一组 ([3,4]) 不应获得索引 11,12 作为匹配项,因为在这种情况下,3 是 [1,3] 的第二个元素,4 是第一个元素[4,7]。

最佳答案

由于您是按对对数组进行分组,因此可以将它们重新调整为 2 列以进行比较。然后,您可以将较短数组中的每个元素与较长数组中的每个元素进行比较,并减少 bool 数组。从这里开始,使用 reshape 的 np.arange 来获取索引就变得很简单。

import numpy as np
from functools import reduce

a = np.array([5,8,3,4,2,5,7,8,1,9,1,3,4,7])
b = np.array ([3,4,7,8,1,3])

# reshape a and b into columns
a2 = a.reshape((-1,2))
b2 = b.reshape((-1,2))

# create a generator of bools for the row of a2 that holds b2
b_in_a_generator = (np.all(a2==row, axis=1) for row in b2)

# reduce the generator to get an array of boolean that is True for each row
# of a2 that equals one of the rows of b2
ix_bool = reduce(lambda x,y: x+y, b_in_a_generator)

# grab the indices by slicing a reshaped np.arange array
ix = np.arange(len(a)).reshape((-1,2))[ix_bool]

ix
# returns:
array([[ 2, 3],
[ 6, 7],
[10, 11]])

如果你想要一个平面数组,只需 ravel ix

ix.ravel()
# returns
array([ 2, 3, 6, 7, 10, 11])

关于python - 查找两个数组之间分组项匹配的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45805720/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com