Python:获取space的最小长度,该长度捕获允许循环的数组的所有非零值

Python: get the minimum length of space that captures all the non zero values of an array with looping allowed

示例:

1)

 v                 v
[1,0,0,1,1,1,1,0,1,1,0,0,0]
 ^                 ^

将 return 结果为 10,因为这是 space 的 minimum length,介于非零值的第一个实例和最后一个实例(粗体)之间。 如果我们改为考虑以下内容:

                 v v
[1,0,0,1,1,1,1,0,1,1,0,0,0] 
                 ^ ^

并循环捕获所有非零值,space 的长度为 13,所以 10 就是我们的答案。

2)

     v             v
[0,0,1,0,0,0,0,0,0,1,1]
     ^             ^

会 return 结果为 5,因为允许循环。如果我们改为考虑以下内容:

     v               v
[0,0,1,0,0,0,0,0,0,1,1] 
     ^               ^

并且没有循环,space 的长度是 9,所以我们的答案是 5。

您可以使用 np.sign + np.argmax 来查找 第一个 non-zero 值的索引,并且 np.cumsum + np.argmax 找到 last non-zero 值的索引。然后减去那些:

>>> a = [1,0,0,1,1,1,1,0,1,1,0,0,0]
>>> np.cumsum(a).argmax() - np.sign(a).argmax() + 1
9
  • np.sign 实质上将数组中的每个值减少到它的符号,因此负数变为 -1,正数变为 1,而 0 保持 0.
  • np.argmax returns 数组中第一次出现的最大值的从0开始的索引,由于np.sign,这将是1,所以它将是第一个 1 的索引,这非常适合这种情况。
  • np.cumsum 对数组的所有项执行累加和。因此,数组中最大值的第一次出现将是最后一个 non-zero 值,因此再次 np.argmax 是完美的。