-1

为了更清楚,让我改写我最初在下面提出的问题。

我有一系列数据点,当有人迈出一步然后又迈出一步时,这些数据点的幅度会上升和下降。零是当脚离开地面时。

一个简单的示例如下所示:

 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)

问题:现在,我想将每个步骤的实际数据从初始数组中分割出来,并将它们分成列。

[注意:如果有必要,我们知道开始或停止数组中的数据量所采取的步数。]

10 10

20 20

50 50

40 40

30 30

10 10

我不知道如何使用这些开始和停止索引来分割初始数组。或者,我没有找到过滤功能来分割步骤。

顺便说一句(第二次编辑) 如果有帮助,这是我正在使用的一些代码:

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)

谢谢,斯科特

4

4 回答 4

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:stops[i] ] for i in range( len(starts) ) ])

我尝试在其他模块中工作以直接获取数组(使用itertools.islicewith itertools.chainnumpy.fromiter等)。但是,即使更高级的解决方案有效,我也不确定它是否会比转换为数组提供显着的速度优势,而且它会不那么简洁。请参阅:如何从生成器构建 numpy 数组?

于 2012-05-30T03:48:39.740 回答
1

我不明白您尝试的方式,但是您可以使用过滤器吗?:

>>> data_array = (0,0,0,10,20,50,40,30,10,0)
>>> filter(lambda x: x>20,data_array)

(50, 40, 30)

也适用于 numpy 数组。

于 2012-05-29T21:19:41.133 回答
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() 更多关于 take

于 2012-05-29T21:20:36.523 回答
1

您的问题并不十分清楚,但如果您要问如何对 Python 列表或可迭代对象进行切片,请使用内置切片函数

>>> 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]
于 2012-05-29T22:49:06.027 回答