Python 查找numpy数组中两个数字的指定匹配项的所有匹配项

Python 查找numpy数组中两个数字的指定匹配项的所有匹配项,python,arrays,performance,numpy,Python,Arrays,Performance,Numpy,我需要实现的是获得所有索引的数组,其中在我的数据数组中填充了0和1,这是从0到1的一步。我需要非常快速的解决方案,因为我必须处理长度为100百万的百万数组。它将在计算机中心运行。例如 data_array = np.array([1,1,0,1,1,1,0,0,0,1,1,1,0,1,1,0]) result = [3,9,13] 试试这个: In [23]: np.where(np.diff(a)==1)[0] + 1 Out[23]: array([ 3, 9, 13], dtype=i

我需要实现的是获得所有索引的数组,其中在我的数据数组中填充了0和1,这是从0到1的一步。我需要非常快速的解决方案,因为我必须处理长度为100百万的百万数组。它将在计算机中心运行。例如

data_array = np.array([1,1,0,1,1,1,0,0,0,1,1,1,0,1,1,0])
result = [3,9,13]
试试这个:

In [23]: np.where(np.diff(a)==1)[0] + 1
Out[23]: array([ 3,  9, 13], dtype=int64)
index = numpy.nonzero((data_array[1:] - data_array[:-1]) == 1)[0] + 1
index
# [3, 9, 13]
100M单元阵列的定时:

In [46]: a = np.random.choice([0,1], 10**8)

In [47]: %timeit np.nonzero((a[1:] - a[:-1]) == 1)[0] + 1
1 loop, best of 3: 1.46 s per loop

In [48]: %timeit np.where(np.diff(a)==1)[0] + 1
1 loop, best of 3: 1.64 s per loop
程序如下:

  • 计算阵列的差异
  • 查找差异==1的索引
  • 将1添加到结果中(b/c
    len(diff)=len(orig)-1
  • 所以试试这个:

    index = numpy.nonzero((data_array[1:] - data_array[:-1]) == 1)[0] + 1
    index
    # [3, 9, 13]
    

    非常感谢你们大家。对于我来说,使用非零的解决方案可能更好,因为我需要知道从0->1到1->0的步骤,并最终计算差异。这就是我的解决方案。任何其他建议,不胜感激。)


    由于它是一个填充了
    0s
    1s
    的数组,您可以通过比较而不是执行单移位版本之间的算术运算来直接得到布尔数组,该数组可以馈送到
    np.flatnonzero
    以获得索引和最终输出

    因此,我们将有一个这样的实现-

    np.flatnonzero(data_array[1:] > data_array[:-1])+1
    
    运行时测试-

    In [26]: a = np.random.choice([0,1], 10**8)
    
    In [27]: %timeit np.nonzero((a[1:] - a[:-1]) == 1)[0] + 1
    1 loop, best of 3: 1.91 s per loop
    
    In [28]: %timeit np.where(np.diff(a)==1)[0] + 1
    1 loop, best of 3: 1.91 s per loop
    
    In [29]: %timeit np.flatnonzero(a[1:] > a[:-1])+1
    1 loop, best of 3: 954 ms per loop
    

    哦,我知道numpy有一个diff函数——虽然我认为它是一个数组方法。我喜欢这个简洁+1@PaulH非常感谢。我也喜欢(已经)你的答案-因为我不知道
    np.nonzero()
    函数,所以我今天从你的答案中学到了一些新的东西。我认为你的解决方案应该更快,因为
    nonzero
    函数…FWIW,我看不出
    nonzero
    我机器上的
    where
    之间有什么区别(对于10**6随机位,两者都大约为6.6毫秒)您的解决方案在10**8阵列上的速度约为12%…我将发布计时…那么,发布的解决方案中有哪一个适合您?