【问题标题】:What does this: s[s[1:] == s[:-1]] do in numpy?这是什么: s[s[1:] == s[:-1]] 在 numpy 中做什么?
【发布时间】:2015-08-30 02:48:56
【问题描述】:

我一直在寻找一种方法来有效地检查 numpy 数组中的重复项,并偶然发现了一个包含使用此代码的答案的问题。

这一行在 numpy 中是什么意思?

s[s[1:] == s[:-1]]

希望在应用之前了解代码。查看了 Numpy 文档,但找不到此信息。

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    切片[1:][:-1] 表示除了第一个除了最后一个之外的所有元素:

    >>> import numpy as np
    >>> s = np.array((1, 2, 2, 3))  # four element array
    >>> s[1:]
    array([2, 2, 3])  # last three elements
    >>> s[:-1]
    array([1, 2, 2])  # first three elements
    

    因此,比较会在每个元素 s[x] 与其 "neighbour" s[x+1] 之间生成一个布尔比较数组,这将比原始数组短一个(因为最后一个元素没有邻居):

    >>> s[1:] == s[:-1]
    array([False,  True, False], dtype=bool)
    

    并使用该数组对原始数组进行索引,您可以获得比较为True 的元素,即与其邻居相同的元素:

    >>> s[s[1:] == s[:-1]]
    array([2])
    

    请注意,这只标识相邻重复值。

    【讨论】:

    • 哇,感谢您的详尽解释:D。会尽快接受。所以我想找到所有的重复,排序然后这样做:D.
    • @zehelvion 是的,如果数组未排序,则需要先排序,此方法才能找到所有重复项。
    • 不应该对数组进行排序吗?
    • @gabhijit 不一定,您可能只是想要找到相邻的重复项
    • 尝试使用布尔值(即掩码)的常规(非 numpy)列表来索引常规列表。那当然行不通。所以我选择了这个:[x for (x,y) in zip(my_list, mask) if y]。以为我会在这里记录它,尽管它当然不会寻找相等的相邻元素。
    【解决方案2】:

    看看这个:

    >>> s=numpy.array([1,3,5,6,7,7,8,9])
    >>> s[1:] == s[:-1]
    array([False, False, False, False,  True, False, False], dtype=bool)
    >>> s[s[1:] == s[:-1]]
    array([7])
    

    所以s[1:] 给出除第一个之外的所有数字,s[:-1] 给出除最后一个之外的所有数字。 现在比较这两个向量,例如查看两个相邻元素是否相同。最后,选择这些元素。

    【讨论】:

      【解决方案3】:

      s[1:] == s[:-1] 将没有第一个元素的 s 与没有最后一个元素的 s 进行比较,即第 0 个与第 1 个、第 1 个与第 2 个等,为您提供 len(s) - 1 布尔元素数组。 s[boolarray] 将只从s 中选择那些在boolarray 对应位置具有True 的元素。因此,代码会提取与下一个元素相等的所有元素。

      【讨论】:

        【解决方案4】:

        它将在已排序的数组中显示重复项。

        基本上,内部表达式s[1:] == s[:-1] 将数组与其移位版本进行比较。想象一下:

        1, [2, 3, ... n-1, n  ]
        -  [1, 2, ... n-2, n-1] n
        => [F, F, ...   F, F  ]
        

        在已排序的数组中,除非您有重复,否则结果数组中不会有True。然后,这个表达式s[array] 过滤那些在索引array 中有True 的那些。

        【讨论】:

          猜你喜欢
          • 2021-05-27
          • 2014-11-10
          • 1970-01-01
          • 1970-01-01
          • 2018-04-05
          • 2010-09-16
          • 2021-12-11
          • 1970-01-01
          相关资源
          最近更新 更多