numpy:在排序列表中,找到每个唯一值的第一个和最后一个索引

迪米特里斯

有了一个排序列表,任何人如何找到(使用numpy)每个唯一值的第一个和最后一个索引?

例:

初始排序列表:

>>> import numpy as np
>>> initial_list = np.array([1, 3, 2, 3, 0, 3, 0, 1, 0])
>>> initial_list.sort()

>>> initial_list
array([0, 0, 0, 1, 1, 2, 3, 3, 3])

其结果将是:

第一:[0,0,0,3,3,5,6,6,6]

最后:[2,2,2,4,4,5,8,8,8]

先感谢您

迪卡卡

这是一种利用输入数据的排序性质的方法,它利用了非常高效的NumPyarray-slicing和其他NumPy函数-

def start_stop_arr(initial_list):
    a = np.asarray(initial_list)
    mask = np.concatenate(([True], a[1:] != a[:-1], [True]))
    idx = np.flatnonzero(mask)
    l = np.diff(idx)
    start = np.repeat(idx[:-1], l)
    stop = np.repeat(idx[1:]-1, l)
    return start, stop

通过级联重复,可以进一步提高性能-

def start_stop_arr_concat_repeat(initial_list):
    a = np.asarray(initial_list)
    mask = np.concatenate(([True], a[1:] != a[:-1], [True]))
    idx = np.flatnonzero(mask)
    l = np.diff(idx)
    idx2 = np.concatenate((idx[:-1,None], (idx[1:,None]-1)),axis=1)
    ss = np.repeat(idx2, l, axis=0)
    return ss[:,0], ss[:,1]

样品运行-

In [38]: initial_list
Out[38]: array([0, 0, 0, 1, 1, 2, 3, 3, 3])

In [39]: start_stop_arr(initial_list)
Out[39]: (array([0, 0, 0, 3, 3, 5, 6, 6, 6]), array([2, 2, 2, 4, 4, 5, 8, 8, 8]))

运行时测试-

其他方法-

# @Mohammed Elmahgiubi's soln
def reversed_app(initial_list): # input expected is a list
    reversed_initial_list = list(reversed(initial_list))
    first = [initial_list.index(i) for i in initial_list]
    last = list(reversed([(len(initial_list) - 
                           (reversed_initial_list.index(i) + 1)) 
                            for i in reversed_initial_list]))
    return first, last

def unique_app(a): # @B. M.'s soln
    _,ind1,inv1,cou1 = np.unique(a, return_index=True, return_inverse=True, 
                                 return_counts=True)
    return ind1[inv1],(ind1+cou1-1)[inv1]

时间-

案例1:较小的数据集

In [295]: initial_list = np.random.randint(0,1000,(10000))
     ...: initial_list.sort()

In [296]: input_list = initial_list.tolist()

In [297]: %timeit reversed_app(input_list)
1 loop, best of 3: 789 ms per loop

In [298]: %timeit unique_app(initial_list)
1000 loops, best of 3: 353 µs per loop

In [299]: %timeit start_stop_arr(initial_list)
10000 loops, best of 3: 96.3 µs per loop

案例2:更大的数据集

In [438]: initial_list = np.random.randint(0,100000,(1000000))
     ...: initial_list.sort()

In [439]: %timeit unique_app(initial_list) # @B. M.'s soln
10 loops, best of 3: 53 ms per loop

In [440]: %timeit start_stop_arr(initial_list)
100 loops, best of 3: 9.64 ms per loop

In [441]: %timeit start_stop_arr_concat_repeat(initial_list)
100 loops, best of 3: 6.76 ms per loop

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Python列表中查找某个值的第一个和最后一个索引

排序列表,但将星号从第一个更改为最后一个

抓住每个序列的第一个和最后一个元素

序列的第一个和最后一个索引

R:获取向量中每个唯一值的第一个和最后一个位置的最快方法?

矢量如何找到第一个和最后一个当前值

获取区域包围的第一个和最后一个值的索引

根据列表的最后一个值和第一个值在 python 中附加嵌套列表

查找升序列表中降序的第一个和最后一个数字

如何比较列表中字符串的第一个和最后一个索引

连接列表的最后一个和第一个值

如何使用SQL获取列中每个分区的第一个和最后一个值

在不是NaN的列中查找第一个和/或最后一个值的索引

如何基于第一个值Python替换元组排序列表中的元组

NumPy数组中的第一个和最后一个元素

ul列表中的第一个和最后一个VISIBLE元素

ngFor循环列表中的第一个和最后一个对象

熊猫从组中获取列的第一个和最后一个值

获取groupby中的第一个和最后一个值

删除组中的第一个和最后一个观测值

PostgreSQL中window函数的第一个和最后一个值

返回数组中的第一个和最后一个值

使用RLE从组中获取第一个和最后一个值

查找数组中的第一个、最后一个和中间值。返回最大的一个

找到一行的第一个和最后一个跨度

保留数组的第一个索引元素和最后一个索引元素

mysql-基于空和空值的排序列表,列中的最后一个

如何根据列值从数据序列中提取第一个和最后一个值?

在元组的第一个索引中找到值不相同的元组列表的索引