我需要实现的是获取所有索引的数组,其中在我的数据数组中填充零和数字是从零到一步。我需要非常快速的解决方案,因为我必须与数以百万计的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]
我需要实现的是获取所有索引的数组,其中在我的数据数组中填充零和数字是从零到一步。我需要非常快速的解决方案,因为我必须与数以百万计的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]
试试这个:
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
哦,我知道numpy有一个diff函数 - 虽然认为它是一个数组方法。我喜欢这个简洁。 +1 –
@PaulH,谢谢!我也喜欢(已经;)你的答案 - 因为我不知道'np.nonzero()'函数,所以我今天从你的答案中学到了新东西 – MaxU
这里的程序:数组的
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的步骤,最后计算差异。所以这是我的解决方案。任何其他的建议表示赞赏。)
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])
因为它是充满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
所以,也无论是发布的解决方案,为您的工作? – Divakar