6

我有两个数组,比如说:

a, b = np.array([13., 14., 15., 32., 33.]), np.array([15., 16., 17., 33., 34., 47.])

我需要找到 a 中不存在于 b 中的所有元素的索引。在上面的示例中,结果将是:

[0, 1, 3]

因为 a[0]、a[1] 和 a[3] 是 13.、14. 和 32.,它们在 b 中是不存在的。请注意,我不想知道 13.、14. 和 32. 的实际值。(在这种情况下,我可以使用 set(a).difference(set(b)))。我真的只对指数感兴趣。

如果可能,答案应该是“矢量化的”,即不使用 for 循环。

4

3 回答 3

3

您可以使用np.in1d

>>> np.arange(a.shape[0])[~np.in1d(a,b)].tolist()
  [0, 1, 3]
于 2013-08-28T11:10:45.517 回答
2

这很容易,numpy.intersect1d用于计算a和之间共享的元素b,然后检查其中哪些元素没有在a使用中numpy.in1d,最后使用 来获取它们在数组中的位置numpy.argwhere

>>> import numpy as np
>>> a, b = np.array([13., 14., 15., 32., 33.]), np.array([15., 16., 17., 33., 34., 47.])
>>> np.argwhere(np.in1d(a, np.intersect1d(a,b)) == False)
array([[0],
   [1],
   [3]])

如果您更喜欢列表,只需添加.flatten以将矩阵转换为向量,然后应用.tolist以获取列表:

>>> np.argwhere(np.in1d(a, np.intersect1d(a,b)) == False).flatten().tolist()
 [0, 1, 3]
于 2013-08-28T11:39:32.303 回答
1

如果您使用循环,则相当简单:

def difference_indices(a, b):

    # Set to put the unique indices in
    indices = []

    # So we know the index of the element of a that we're looking at
    a_index = 0

    for elem_a in a:

        found_in_b = False
        b_index = 0

        # Loop until we find a match. If we reach the end of b without a match, the current 
        # a index should go in the indices list
        while not found_in_b and b_index < len(b):
            if elem_a == b[b_index]: found_in_b = True
            b_index = b_index + 1

        if not found_in_b: indices.append(a_index)
        a_index = a_index + 1

    return indices

这应该适用于包含任何一种类型的列表,只要它们是相同的类型,并且__eq__函数是为该类型定义的。

在没有循环的情况下执行此操作将需要比我的 Python 知识更丰富的知识!希望这对你有用。

于 2013-08-28T11:19:50.080 回答