我需要实现的是获取所有索引的数组,在我的数据数组中填充零和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]
答案 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)
这是程序:
len(diff) = len(orig) - 1
)所以试试这个:
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)
由于它是一个填充了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