在numpy数组中查找两个数字的指定匹配的所有出现

时间:2016-09-13 18:07:41

标签: python arrays performance numpy

我需要实现的是获取所有索引的数组,在我的数据数组中填充零和1是从零到一步。我需要非常快速的解决方案,因为我必须使用数百万个数百万个长度的数字阵列。它将在计算中心运行。比如..

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

4 个答案:

答案 0 :(得分:3)

试试这个:

In [23]: np.where(np.diff(a)==1)[0] + 1
Out[23]: array([ 3,  9, 13], dtype=int64)

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)

这是程序:

  1. 计算数组的差异
  2. 找到diff == 1
  3. 的索引
  4. 在结果中添加1(b / c len(diff) = len(orig) - 1
  5. 所以试试这个:

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

答案 2 :(得分:0)

非常感谢大家。非零的解决方案对我来说可能更好,因为我需要知道从0-> 1和1-> 0的步骤,最后计算差异。所以这是我的解决方案。任何其他建议表示赞赏。)

 UPDATE mytable
    SET some_col = 'some_value'
  WHERE id = 42 

答案 3 :(得分:0)

由于它是一个填充了0s1s的数组,因此只需比较而不是在单移位版本之间执行算术运算直接给出布尔数组,可以将其输入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