为了更清楚,让我重新提出我最初在下面提出的问题。
我有一系列数据点,当有人迈出一步然后又迈出另一步时,它们的振幅会上升和下降。零是脚离开地面的时候。
一个简单的例子如下:
data_array = (0,0,0,10,20,50,40,30,10,0,0,0,0,0,10,20,50,40,30,10,0,0)
我通过记录一个数组中的开始(所有索引开始)和另一个数组中的停止来确定每个步骤的开始和停止时间。
starts =(4 15)
停止=(9 20)
问题:现在,我想将初始数组中每一步的实际数据切片,并将它们分成列。
[注意:如果需要,我们知道开始或停止数组中的数据量所采取的步骤数。]
10 10
20 20
50 50
40 40
30 30
10 10
我无法弄清楚如何使用这些启动和停止索引来切割初始数组。或者,我没有找到过滤功能来切除步骤。
BTW(第2次编辑) 以下是我正在使用的一些代码:
sigma = 5
threshold = 30
above_threshold = gaussian_filter(Fz, sigma=sigma) > threshold
#---INDEX ALL STATE CHANGES---
ind = np.where(np.diff(above_threshold))[0] + 1
print ind
原始问题
在这种类型的数组中:
data_array = (0,0,0,10,20,50,40,30,10,0,0)
我确定何时值大于20且小于20.我将这些索引作为开始(超过20)并通过以下方式停止(低于20):
startstop = np.vstack((ind[::2], ind[1::2])).T
starts1=np.vstack((ind[::2])).T
stops1=np.vstack((ind[1::2])).T
有人可以使用numpy(或不使用)指向正确的方向,这样我就可以使用其中一个数组(startstop,starts1,stops1)在data_array中提取所有这些值来获取:
new_array = (50,40,30)
谢谢, 斯科特
答案 0 :(得分:1)
我不明白你试图去做的方式,但是你可以使用filter吗?:
>>> data_array = (0,0,0,10,20,50,40,30,10,0)
>>> filter(lambda x: x>20,data_array)
(50, 40, 30)
也适用于numpy数组。
答案 1 :(得分:1)
take()会做你想做的事,我想。
data_array = np.array([0,0,0,10,20,50,40,30,10,0])
b = data_array.take([1,2,3])
print b
输出:
[ 0 0 10]
了解详情:take() more on take
答案 2 :(得分:1)
您的问题并不十分清楚,但如果您要问如何切片Python列表或可迭代,请使用内置的slice function:
>>> data_array = (0,0,0,10,20,50,40,30,10,0)
>>> data_array[slice(5,8)]
(50, 40, 30)
>>> new_list=list(data_array[slice(5,8)])
>>> new_list
[50, 40, 30]
答案 3 :(得分:1)
Python列表使用方括号定义,我们希望生成列表列表(其中每个部分包含一个已定义的段)。由于计算机从0开始计数,因此“第4个元素是开始”转换为数组索引= 3。
一个怪癖就是要查询第4到第9个元素,我们将使用data_array [3:9]:这个切片符号为您提供从第一个指定开始的每个元素,直到(但不包括)最后一个元素。其余的是一个列表理解,它遍历任意数量的步骤段。
starts = [4, 15]
stops = [9, 20]
data_array = [0,0,0,10,20,50,40,30,10,0,0,0,0,0,10,20,50,40,30,10,0,0]
segments = [ data_array[starts[i] - 1: stops[i] ] for i in range( len(starts) ) ]
返回
>>> segments
[[10, 20, 50, 40, 30, 10], [10, 20, 50, 40, 30, 10]]
可以单独访问每组步骤(段):
>>>segments[0]
[10, 20, 50, 40, 30, 10]
编辑:或者......如果你需要使用numpy数组,那么试试: segments = array([data_array [starts [i] - 1:stop [i]] for i in range(len(starts))])
我尝试使用其他模块直接获取数组(使用itertools.islice
itertools.chain
,numpy.fromiter
等)。但即使更高级的解决方案有效,我也不确定它是否比转换到阵列提供了显着的速度优势,而且它的简洁性要低得多。请参阅:How do I build a numpy array from a generator?