更清楚地说,让我重述一下我最初在下面提出的问题。
我有一系列的数据点,当有人迈出一步,然后又迈出一步时,它们的振幅会上升或下降。当脚离地时为零。
一个简单的例子如下:
data_array = (0,0,0,10,20,50,40,30,10,0,0,0,0,0,10,20,50,40,30,10,0,0)
我通过记录一个数组中的开始(所有开始的索引)和另一个数组中的停止来确定每个步骤何时开始和停止。
开始=(4 15)
停止=(9 20)
问题是:现在,我想将每个步骤的实际数据从初始数组中分割出来,并将它们分成列。
[注:如有必要,我们知道start或stops数组中的数据量所采取的步骤数。]
2010年
20 20个
50 50个
40 40个
30 30个
2010年
我不知道如何使用这些开始和停止索引来分割初始数组。或者,我没有找到过滤函数来分割步骤。
BTW(第二次编辑) 下面是一些我正在使用的代码,如果有帮助的话:
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)提取数据数组中的所有值,得到:
new_array = (50,40,30)
谢谢, 斯科特
我不明白你想怎么做,但你能用filter吗?以下内容:
也适用于numpy数组。
take()会做你想做的,我想。
输出:
阅读更多:take()more on take
Python列表是用方括号定义的,我们希望生成一个列表列表(其中每个部分包含一个定义的段)。因为计算机从0开始计数,“第四个元素是开始”转换为数组索引=3。
一个怪癖是,要查询第4到第9个元素,我们将使用data_array[3:9]:这个切片表示法为您提供从指定的第一个元素开始到(但不包括)最后一个元素的每个元素。剩下的是一个列表理解,它遍历任意数量的步骤段。
回报
每组步骤(段)可单独访问:
编辑:或者。。。如果需要使用numpy数组,请尝试: segments=array([data_array[starts[i]-1:stops[i]]for i in range(len(starts))])
我尝试在其他模块中直接获取数组(使用
itertools.islice
和itertools.chain
、numpy.fromiter
等)。但是,即使这个更奇特的解决方案奏效了,我也不确定它是否比转换成一个数组有显著的速度优势,而且它也不会那么简洁。见:How do I build a numpy array from a generator?相关问题 更多 >
编程相关推荐