Ame*_*ina 8 python algorithm numpy
说我有以下数字列表:
my_array = [0, 3, 4, 7, 8, 9, 10, 20, 21, 22, 70]
Run Code Online (Sandbox Code Playgroud)
我想找到每个包含连续整数的闭合区间,在此列表中没有间隙.如果列表中的任何数字都有多个这样的间隔,我们只保留任何此类间隔中的最大值.上面的正确答案应该是:
[0, 0]
[3, 4]
[7, 10]
[20, 22]
[70, 70]
Run Code Online (Sandbox Code Playgroud)
要看到这一点,请注意例如:
闭合间隔[0,0]包含整数0,不包含间隙,并且其任何成员都不包含在任何其他闭合间隔中.
闭合间隔不[3,4]包含间隙,其成员不包含在任何其他闭合间隔中,没有比自身大的间隙.
怎么能在numpy中做到这一点?我开始编写一种算法,用于np.diff(my_array)检测数组中的转换,但它在角落情况下失败,例如只包含一个项目的间隔.
我没有方便的 numpy 安装,但这是我会采取的方法。首先单独处理空数组的情况。如果尚未排序,则对数组进行排序并用于np.diff计算差异。
0, 3, 4, 7, 8, 9, 10, 20, 21, 22, 70
3 1 3 1 1 1 10 1 1 48
Run Code Online (Sandbox Code Playgroud)
测试差异是否为> 1。
1 0 1 0 0 0 1 0 0 1
Run Code Online (Sandbox Code Playgroud)
要获取间隔的开头,请1在开头放置 a 并选择相应的数组项。要获得末尾,请1在末尾放置一个并选择相应的数组项。
0, 3, 4, 7, 8, 9, 10, 20, 21, 22, 70
1 1 0 1 0 0 0 1 0 0 1
0 3 7 20 70
0, 3, 4, 7, 8, 9, 10, 20, 21, 22, 70
1 0 1 0 0 0 1 0 0 1 1
0 4 10 22 70
Run Code Online (Sandbox Code Playgroud)
实现(主要由user815423426):
def get_intervals(my_array):
my_diff = np.diff(my_array)>1
begins = np.insert(my_diff, 0, 1)
ends = np.insert(my_diff, -1, 1)
return np.array(np.dstack((my_array[begins], my_array[ends])))
my_array = np.array([0, 3, 4, 7, 8, 9, 10, 20, 21, 22, 70])
> get_intervals(my_array)
array([[ 0, 0],
[ 3, 4],
[ 7, 10],
[20, 22],
[70, 70]])
Run Code Online (Sandbox Code Playgroud)