【问题标题】:Python: Get indices of common values in 3 sorted arraysPython:获取 3 个排序数组中常见值的索引
【发布时间】:2017-11-01 17:16:36
【问题描述】:

我有三个排序数组:

>>> a = arange(10)
>>> b = arange(3,12)
>>> c = arange(-2,8)
>>> print(a)
[0 1 2 3 4 5 6 7 8 9]
>>> print(b)
[ 3  4  5  6  7  8  9 10 11]
>>> print(c)
[-2 -1  0  1  2  3  4  5  6  7]

我想得到一个包含在所有其他数组中的每个数组元素的索引列表。

在本例中,每个数组中的索引对应于数字 3 - 7

类似:

a_inds, b_inds, c_inds = get_unq_inds(a,b,c)

a_inds = [3,4,5,6,7] (or [False, False, False,  True,  True,  True,  True,  True,  False,  False])

b_inds = [0,1,2,3,4] (or [True, True, True, True, True, False, False, False, False])

基本上,我想扩展这里提供的解决方案: (Find indices of common values in two arrays) 到 3 个数组。 (或者,如果你有野心,'n' 数组)

【问题讨论】:

  • 那么您想要索引列表还是布尔值列表?
  • 我认为任何一个都可以达到我的目的

标签: python arrays sorting unique


【解决方案1】:

你可以这样做:

def get_unq_inds(a, b, c):
    uniq_vals = list(set(a).intersection(b).intersection(c))
    return [a.index(x) for x in uniq_vals], [b.index(x) for x in uniq_vals], [c.index(x) for x in uniq_vals]
    # you can use this for boolean values
    #return [x in uniq_vals for x in a], [x in uniq_vals for x in b], [x in uniq_vals for x in c]

输出

a_inds, b_inds, c_inds = get_unq_inds(range(9), range(3,12), range(-2,8))

>>> a_inds, b_inds, c_inds
([3, 4, 5, 6, 7], [0, 1, 2, 3, 4], [5, 6, 7, 8, 9])

OUTPUT 用于布尔值:

[False, False, False, True, True, True, True, True, False]
[True, True, True, True, True, False, False, False, False]
[False, False, False, False, False, True, True, True, True, True]

现场演示here

【讨论】:

  • yeh +1 如果顺序不重要,我们的组合答案似乎最好
  • 实际上我不再相信这是最好的,因为索引调用会增加时间复杂度,但仍然是个好主意
【解决方案2】:

您可以组合所有范围以获取 set 中的公共元素,然后对此进行测试:

>>> ranges = [range(9), range(3,12), range(-2,8)]
>>> s = set.intersection(*map(set,ranges))
>>> [[i for i,x in enumerate(sublist) if x in s] for sublist in ranges]
[[3, 4, 5, 6, 7], [0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]

这适用于任意数量的输入列表。

或者类似地使用相同的s 和@Ashish Ranjan 的想法(注意索引可能没有排序,因为我们正在迭代无序的set(),尽管在实践中它们可能会由于方式而保持顺序Python 哈希的整数):

[[sublist.index(x) for x in s] for sublist in ranges]

【讨论】:

    【解决方案3】:

    对于布尔值列表,您可以使用列表推导。

    a_inds = [x in b and x in c for x in a]
    

    【讨论】:

    • 我认为这应该是 [x in b AND x in c for x in a]?但我喜欢简单。
    猜你喜欢
    • 2017-12-14
    • 1970-01-01
    • 2011-09-19
    • 2013-07-24
    • 2011-06-19
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多