【问题标题】:Find the first index of recurring elements查找重复元素的第一个索引
【发布时间】:2021-08-23 09:08:55
【问题描述】:

给定一个包含重复元素的 numpy 数组:

a = numpy.array([1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 1, 1]) 

如何找到每个循环元素(1、2、3、1)的第一个索引?我希望它返回一个索引数组:

>> index
array([0, 4, 7, 12])

注意:数组中的元素可以重复,因此它们不是唯一的。
编辑:有没有一种方法也适用于字符串数组?

a = numpy.array(["a", "a", "a", "a", "c", "c", "c", "b", "b", "b", "b", "b", "a", "a"]) 

【问题讨论】:

    标签: python arrays numpy indexing


    【解决方案1】:

    您可以使用 np.where 获取 np.diff 并添加第 0 个元素:

    np.concatenate(([0],np.where(np.diff(a)!=0)[0]+1))
    

    array([ 0,  4,  7, 12], dtype=int64)
    

    【讨论】:

    • 有没有办法也可以将其扩展为字符串数组?例如:a = numpy.array(["a", "a", "a", "a", "c", "c", "b", "b", "b", "a", "一"])
    【解决方案2】:

    np.searchsorted 如果数组按 升序 顺序排列,则速度很快

    np.searchsorted(a, [1,2,3,4])
    

    输出:

    array([ 0,  4,  7, 14])
    

    如果数组未排序,则需要使用 argsort 来回排序:

    a = np.array([1, 3, 3, 5, 5, 2, 2, 0, 0, 3, 3, 3, 1, 4]) 
    i = a.argsort()
    i[np.searchsorted(a[i], [0, 1, 2, 4, 5])]
    

    输出:

    array([ 7,  0,  5, 13,  3])
    

    这也有效:

    i[np.searchsorted(a, [0, 1, 2, 4, 5], sorter=i)]
    

    输出:

    array([ 7,  0,  5, 13,  3])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-10
      • 1970-01-01
      • 2020-06-10
      • 1970-01-01
      相关资源
      最近更新 更多