2016-09-13 36 views
2

我需要实现的是获取所有索引的数组,其中在我的数据数组中填充零和数字是从零到一步。我需要非常快速的解决方案,因为我必须与数以百万计的hundrets milions数组一起工作。它将在计算中心运行。例如..查找numpy数组中所有指定匹配的两个数的所有匹配

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

所以,也无论是发布的解决方案,为您的工作? – Divakar

回答

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 
+0

哦,我知道numpy有一个diff函数 - 虽然认为它是一个数组方法。我喜欢这个简洁。 +1 –

+0

@PaulH,谢谢!我也喜欢(已经;)你的答案 - 因为我不知道'np.nonzero()'函数,所以我今天从你的答案中学到了新东西 – MaxU

1

这里的程序:数组的

  1. 计算的差异
  2. 查找索引,其中DIFF == 1
  3. 加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

我认为你的解决方案应该更快,因为“非零”函数... – MaxU

+0

FWIW,我在我的机器上看到'nonzero'和'where'之间没有任何区别(对于10 ** 6个随机位,两者都是6.6 ms左右) –

+0

您的解决方案大约是。在10 ** 8阵列上速度提高12%......我将发布时间... – MaxU

0

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

i_in = np.nonzero( (data_array[1:] - data_array[:-1]) == 1 )[0] +1 
i_out = np.nonzero( (data_array[1:] - data_array[:-1]) == -1 )[0] +1 

i_return_in_time = (i_in - i_out[:i_in.size]) 
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 
相关问题