查找包含另一个数组中的值之一的数组中的索引

时间:2016-06-24 22:17:18

标签: python arrays numpy

如何通过具有多个“标记”的另一个数组(标签)获取数组(a)中的值索引?例如,给定

label = array([1, 2])
a = array([1, 1, 2, 2, 3, 3])

目标是找到a的索引值为1或2;也就是说,0,1,2,3。

我尝试了几种组合。以下所有内容似乎都不起作用。

label = array([1, 2])
a = array([1, 1, 2, 2, 3, 3])
idx = where(a==label)  # gives me only the index of the last value in label
idx = where(a==label[0] or label[1])  # Is confused by all or any?
idx = where(a==label[0] | label[1])   # gives me results as if nor. idx = [4,5] 
idx = where(a==label[0] || label[1])  # syntax error
idx = where(a==bolean.or(label,0,1)   # I know, this is not the correct form but I don`t remember it correctly but remember the error: also asks for a.all or a.any
idx = where(label[0] or label[1] in a)         # gives me only the first appearance. index = 0. Also without where().
idx = where(a==label[0] or a==label[1]).all()) # syntax error
idx = where(a.any(0,label[0] or label[1]))  # gives me only the first appearance. index=0. Also without where().
idx = where(a.any(0,label[0] | label[1]))  # gives me only the first appearance. index=0. Also without where().
idx=where(a.any(0,label))  # Datatype not understood

好的,我认为你得到了我的问题。有谁知道如何正确地做到这一点? Best是一个带有通用标签而不是标签[x]的解决方案,因此标签的使用对于以后的更改更加可变。

4 个答案:

答案 0 :(得分:4)

您可以使用numpy.in1d

>>> a = numpy.array([1, 1, 2, 2, 3, 3])
>>> label = numpy.array([1, 2])
>>> numpy.in1d(a, label)
array([ True,  True,  True,  True, False, False], dtype=bool)

以上返回一个掩码。如果你想要索引,你可以在掩码数组上调用numpy.nonzero

此外,如果label数组中的值是唯一的,您可以将assume_unique=True传递给in1d,以加快速度。

答案 1 :(得分:1)

np.where(a==label)np.nonzeros(a==label)相同。它告诉我们数组中所有非零(或True)元素的坐标(索引)a==label

因此,不要尝试所有这些不同的where表达式,而是关注条件数组

没有where这里是你的一些表达产生的东西:

In [40]: a==label  # 2 arrays don't match in size, scalar False   
Out[40]: False  

In [41]: a==label[0]   # result is the size of a
Out[41]: array([ True,  True, False, False, False, False], dtype=bool)

In [42]: a==label[0] or label[1]  # or is a Python scalar operation
...
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

In [43]: a==label[0] | label[1]
Out[43]: array([False, False, False, False,  True,  True], dtype=bool)

这最后一个与a==(label[0] | label[1])相同,|==之前进行评估。

在了解where给出的内容之前,您需要了解每个数组(或标量或错误)的生成方式。

2个相等测试的正确组合(extra()很重要):

In [44]: (a==label[1]) | (a==label[0])
Out[44]: array([ True,  True,  True,  True, False, False], dtype=bool)

使用广播分别测试label的2个元素。结果是2d数组:

In [45]: a==label[:,None]
Out[45]: 
array([[ True,  True, False, False, False, False],
       [False, False,  True,  True, False, False]], dtype=bool)

In [47]: (a==label[:,None]).any(axis=0)
Out[47]: array([ True,  True,  True,  True, False, False], dtype=bool)

答案 2 :(得分:0)

据我了解,你希望数组“a”中的索引为1和2。

在这种情况下,请尝试

label= [1,2] 
a= [1,1,2,2,3,3]

idx_list = list()
for x in label:
    for i in range(0,len(a)-1):
        if a[i] == x:
            idx_list.append(i)

答案 3 :(得分:0)

我认为我正在阅读的内容是将索引放在第一个列表中的第二个列表中,' a','标签' 。我认为字典是存储这些信息的好方法,其中标签将是键,索引将是值。

试试这个:

    labels = [a,2]
    a = [1,1,2,2,3,3]
    results = {}
    for label in labels:
        results[label] = [i for i,x in enumerate(a) if x == label]

如果你想索引1只是调用结果[1]。列表理解是枚举函数,这里是真正的MVP。