我有以下数组
a = [1, 2, 3, 0, 0, 0, 0, 0, 0, 4, 5, 6, 0, 0, 0, 0, 9, 8, 7,0,10,11]
我想找到连续为零的数组的开始和结束索引,输出上方的数组如下所示
[3,8],[12,15],[19]
我想做得尽可能高效。
这是一个相当紧凑的矢量化实现。我已经更改了一些要求,所以返回值有点“
numpythonic”:它创建一个形状为(m,2)的数组,其中m是零的“游程”数。第一列是每次运行中前0个的索引,第二列是运行后第一个非零元素的索引。(例如,此索引模式匹配切片的工作方式以及range
函数的工作方式。)
import numpy as np
def zero_runs(a):
# Create an array that is 1 where a is 0, and pad each end with an extra 0.
iszero = np.concatenate(([0], np.equal(a, 0).view(np.int8), [0]))
absdiff = np.abs(np.diff(iszero))
# Runs start and end where absdiff is 1.
ranges = np.where(absdiff == 1)[0].reshape(-1, 2)
return ranges
例如:
In [236]: a = [1, 2, 3, 0, 0, 0, 0, 0, 0, 4, 5, 6, 0, 0, 0, 0, 9, 8, 7, 0, 10, 11]
In [237]: runs = zero_runs(a)
In [238]: runs
Out[238]:
array([[ 3, 9],
[12, 16],
[19, 20]])
使用这种格式,很容易在每次运行中获得零的数量:
In [239]: runs[:,1] - runs[:,0]
Out[239]: array([6, 4, 1])
检查边缘情况总是一个好主意:
In [240]: zero_runs([0,1,2])
Out[240]: array([[0, 1]])
In [241]: zero_runs([1,2,0])
Out[241]: array([[2, 3]])
In [242]: zero_runs([1,2,3])
Out[242]: array([], shape=(0, 2), dtype=int64)
In [243]: zero_runs([0,0,0])
Out[243]: array([[0, 3]])
问题内容: 在numpy数组中找到最大连续重复nan的最佳方法是什么? 例子: 输入1: 输出1: 输入2: 输出2: 问题答案: 这是一种方法- 这是一个改进的版本- 基准测试-
问题内容: 我正在尝试使用蒙特卡洛算法查找下周的乐透数字包含连续数字的概率。我认为对数字进行排序可能会使实际查找连续项更加容易,但是在网上搜索了很多之后,似乎并没有什么真正可以帮助我寻找所需内容的信息 到目前为止,这就是我所知道的,我知道我将使用计数器来查找百万结果中的连续数,但实际上我只是为如何真正找到连续数而烦恼 问题答案: 首先我读错了问题,对不起,答案很抱歉! 好吧,让我们分手吧。那么首先
问题内容: 我在数据库表中有一组相当大的电话号码(大约200万个)。这些数字已插入到块中,因此存在许多连续的数字范围,范围从10个数字到1万个数字。其中一些号码正在使用中,因此标记为不可用,其余号码可用。给定一个特定的数字,我需要一种方法来查找该数字之上和之下的连续数字范围。范围应一直持续到找到不可用的数字或遇到两个范围的边界为止。 例如,给定以下设置: 使用1012作为参数进行搜索应返回1010
问题内容: 我有以下数据按player_id和match_date排序。我想找出连续运行次数最多的记录组(从2014-04-03到2014-04-12连续3次运行4次) 我想出了以下SQL: 但这 延续 了之前连续运行的排名(由于玩家1已经出现3次,因此在2014-04-19进行的4次针对Player 1的排名预计为1,但排名为4)。同样,在2014-04-19上,玩家2的23奔跑有望获得等级1,
问题内容: 我想删除彼此跟随的重复项,但不要删除整个数组中的重复项。另外,我想保持顺序不变。 所以如果输入是输出 我找到了一种使用方法,但我正在寻找更快的NumPy解决方案。 问题答案: 一般的想法是用来查找数组中两个连续元素之间的差异。然后我们只索引那些给出差异元素的索引。但由于长度 是1那么短的索引之前,我们需要对涉及diff阵列的开始。 说明:
问题内容: 是否有numpy-thonic方法(例如函数)在数组中查找最接近的值? 例: 问题答案: