在Python中查找arrary中突然更改的开始和结束

时间:2015-09-09 18:23:09

标签: python arrays

对Python来说很新,在我看来这个任务根据我的学习是无法解决的。

请帮助:

  1. 我有一个由Python程序创建的数组,它提供了一个像这样的1d数组:

    [0,0,.01,.1,1,1,.1,.01,0,0,0,0.01,.1,1,.1,.01,0,0,0,.01,.1,1,1,.1,.01,0,0,0,.01,.1,1,1]

  2. 您可以看到数组编号从零到最大,然后再次为零。

  3. 我需要找到每次开始上下起伏的索引。所以这里是[3,9,12,17,20,26,29]

  4. 这是我到目前为止所尝试的,但徒劳无功

    My_array==[0,0,.01,.1,1,1,.1,.01,0,0,0,0.01,.1,1,.1,.01,0,0,0,.01,.1,1,1,.1,.01,0,0,0,.01,.1,1,1]
    
    def _edge(ii):
        for i in range (ii, len(My_array)):
            if np.abs(My_array[i]-My_array[i-1])>.01;
            index=i # save the index where the condition met
            break
    
        for ii in range (1, len(My_array))
    
        if ii <len(My_array): # make sure the loop continues till the end
            F1_Index=_edge(ii)
            F1_Index1.append(F1_Index)
    

2 个答案:

答案 0 :(得分:0)

以下我认为你需要的是什么。它首先构建一个包含-101的列表,给出相邻值之间的差异(遗憾的是cmp已从Python 3中删除,因为这是完美的功能这个)。然后,它使用groupby函数和非零过滤器生成方向更改时的索引列表:

import itertools

My_array = [0, 0, .01, .1, 1, 1, .1, .01, 0, 0, 0, 0.01, .1, 1, .1, .01, 0, 0, 0, .01, .1, 1, 1, .1, .01, 0, 0, 0, .01, .1, 1, 1]

def my_cmp(x,y):
    if x == y:      # Or for non-exact changes use:  if abs(x-y) <= 0.01:
        return 0
    else:
        return 1 if y > x else -1

def pairwise(iterable):
    a, b = itertools.tee(iterable)
    next(b, None)
    return zip(a, b)

slope = [(my_cmp(pair[1], pair[0]), index) for index, pair in enumerate(pairwise(My_array))]
indexes_of_changes = [next(g)[1]+1 for k,g in itertools.groupby(slope, lambda x: x[0]) if k != 0]

print(indexes_of_changes)

为您的数据提供以下结果:

[2, 6, 11, 14, 19, 23, 28]

注意,这会给你方向带来任何改变,而不仅仅是> 0.01

使用Python 3进行测试。

答案 1 :(得分:0)

如果您使用numpy,您可以执行以下操作:

import numpy as np
a = np.array([0,0,.01,.1,1,1,.1,.01,0,0,0,0.01,.1,1,.1,.01,0,0,0,.01,.1,1,1,.1,.01,0,0,0,.01,.1,1,1])
b = a[1:] - a[:-1]  # find differences between sequential elements
v = abs(b) == 0.01  # find differences whose magnitude are 0.01
                    # This returns an array of True/False values
edges = v.nonzero()[0] # find indexes of True values
edges += 2  # add 1 because of the differencing scheme, 
            # add 1 because the results you give in the question 
            # are 1 based arrays and python uses zero based arrays
edges
>  array([ 3,  9, 12, 17, 20, 26, 29], dtype=int64)

这是我发现做这种事情的最快方式。