如何计算Numpy数组中每个1左侧的零的数量

2024-03-29 08:21:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个像这样的numpy二进制数组:

   Array A = [1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0]

我想计算每个1的左边有多少个0,然后在另一个数组中返回它,这个数组在这个例子中是这样的:

^{pr2}$

前两个1在左边没有0,所以数组的前两个数字是0等。。。在

我知道首先我必须启动一个数组,数组中有1个:

def give_zeros(binary_array):
    binary_array = np.asarray(binary_array)
    nb_zeros = np.zeros(binary_array.sum())


    return nb_zeros

但我不知道怎么数到零。我应该用'nditer'在for循环中迭代吗?它似乎没有效率,因为我必须在非常大的数组上运行这个函数。在

你有什么想法吗? 谢谢您。在


Tags: numpydefnp二进制zeros数字数组array
3条回答

这是一个向量化的方法,它从1s的索引中区分范围数组-

def leftzeros_count(a):
    idx = np.flatnonzero(a!=0)
    return idx - np.arange(len(idx))

样本运行-

^{pr2}$

运行时测试

对于计时,让我们将给定样本平铺大量的时间和矢量化方法-

In [7]: a = np.array([1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0])

In [8]: a = np.tile(a,100000)

# @Eric Duminil's soln
In [9]: %timeit (a == 0).cumsum()[a > 0]
100 loops, best of 3: 10.9 ms per loop

# Proposed in this post
In [10]: %timeit leftzeros_count(a)
100 loops, best of 3: 3.71 ms per loop

以非矢量化方式:

>>> x = [1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0]
>>> c, y = 0, []
>>> for i in x:
...     if i == 1:
...         y.append(c)
...     else:
...         c += 1
... 
>>> y
[0, 0, 1, 2, 2, 5]

有关矢量化解决方案,请参见@Divakar的答案:

numpy中,首先用^{}找到非零索引:

^{pr2}$

然后用索引长度的范围数组减去:

>>> idx = np.nonzero(x)[0]
>>> np.arange(len(idx))
array([0, 1, 2, 3, 4, 5])
>>> np.nonzero(x)[0] - np.arange(len(idx))
array([0, 0, 1, 2, 2, 5])

>>> np.arange(x.count(1))
array([0, 1, 2, 3, 4, 5])
>>> np.nonzero(x)[0] - np.arange(x.count(1))
array([0, 0, 1, 2, 2, 5])

代码

您可以使用:

(A == 0).cumsum()[A > 0]
# array([0, 0, 1, 2, 2, 5])

或者:

^{pr2}$

如果A是bool数组。在

解释

A == 0是一个布尔数组,对于每个0,它是True

>>> import numpy as np
>>> A = np.array([1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0])
>>> A == 0
array([False, False,  True, False,  True, False, False,  True,  True,
        True, False,  True,  True,  True,  True], dtype=bool)

您可以使用^{}来计算True的数目:

>>> (A == 0).cumsum()
array([0, 0, 1, 1, 2, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9])

您只需要A > 0中的值:

>>> (A == 0).cumsum()[A > 0]
array([0, 0, 1, 2, 2, 5])

完成了!在

相关问题 更多 >