对Python来说很新,在我看来这个任务根据我的学习是无法解决的。
请帮助:
我有一个由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]
您可以看到数组编号从零到最大,然后再次为零。
我需要找到每次开始上下起伏的索引。所以这里是[3,9,12,17,20,26,29]
这是我到目前为止所尝试的,但徒劳无功
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)
答案 0 :(得分:0)
以下我认为你需要的是什么。它首先构建一个包含-1
,0
或1
的列表,给出相邻值之间的差异(遗憾的是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)
这是我发现做这种事情的最快方式。