Slice Array给定Python中另一个数组的范围

时间:2012-05-29 21:05:42

标签: python arrays numpy slice

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

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

一个简单的例子如下:

 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)

谢谢, 斯科特

4 个答案:

答案 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.chainnumpy.fromiter等)。但即使更高级的解决方案有效,我也不确定它是否比转换到阵列提供了显着的速度优势,而且它的简洁性要低得多。请参阅:How do I build a numpy array from a generator?