Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Python中的另一个数组中分割给定范围的数组_Python_Arrays_Numpy_Slice - Fatal编程技术网

从Python中的另一个数组中分割给定范围的数组

从Python中的另一个数组中分割给定范围的数组,python,arrays,numpy,slice,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) 我通过在一个数组中记录开始(所有开始的索引)和在另一个数组中记录停止来确定每个步骤何时开始和停止 开始=(4 15) 停止=(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)
我通过在一个数组中记录开始(所有开始的索引)和在另一个数组中记录停止来确定每个步骤何时开始和停止

开始=(4 15)

停止=(9 20)

问题是:现在,我想从初始数组中分割出每一步的实际数据,并将它们分为列

[注意:如有必要,我们知道starts或stops数组中的数据量所采取的步骤数。]

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(或非numpy)为我指出正确的方向,以便我可以使用其中一个数组(startstop、starts1、stops1)提取data_数组中的所有值,以获得以下结果:

new_array = (50,40,30)
谢谢,
斯科特

我不明白你想怎么做,但你能用吗

也适用于numpy阵列。

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]
阅读更多:

您的问题并不十分清楚,但如果您要询问如何分割Python列表或iterable,请使用内置的:


Python列表是用方括号定义的,我们希望生成一个列表列表(其中每个片段包含一个定义的片段)。因为计算机从0开始计数,所以“第四个元素是开始”转换为数组索引=3

一个怪癖是,要查询第4到第9个元素,我们将使用data_数组[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阵列,请尝试: 段=数组([data_array[starts[i]-1:范围内i的停止[i]](len(starts)))


我尝试在其他模块中直接获取阵列(使用
itertools.islice
itertools.chain
numpy.fromiter
等)。但是,即使更高级的解决方案有效,我也不确定它与转换为阵列相比是否能提供显著的速度优势,而且它的简洁性要差得多。请参阅:

我重新编写了上面的问题。你说得对,不是很清楚。我能用你的建议而不加5,8吗。我以前试过,但无法通过传入变量来自动执行代码和取出多个切片。@Scott:是的。您可以执行
data\u array[slice(start,stop)]
,作为示例,slice内置的slice语法没有
l[8:10]
的slice语法那么挑剔。这很有意义,谢谢。似乎我的主要问题是我真的试图把所有东西都保存在一个最初有数据的2D numpy数组中。我把它整理成一个列表,然后开始工作。但是,我想重建numpy数组,以便对每个段进行数学运算。谢谢,take稍后可能会派上用场。但是,我需要自动化这个,而不是输入1,2,3。您可以替换数组[1,2,3]。使用包含所需元素索引的数组。如下所示:b=data\u array.take(starts1)。以为这是你的问题吗?starts1只包含起始索引(一个元素),我在stops1中有范围的结尾。我可以创建一个新数组,其中包含每个开始和停止之间的所有索引。然后把它们传进来。看起来贵吗?过滤器现在很吸引人。我目前正在使用sigma=5 threshold=30 Upper_threshold=gaussian_filter(Fz,sigma=sigma)>threshold#arrray和True/Falso挂起值Upper/Down filter#---索引所有状态更改---ind=np.where(np.diff(高于_阈值))[0]+1打印IND抱歉,stackoverflow新手,不知道如何更好地格式化我的回复。希望有意义。如果我将我的numpy数组调整为1D列表,这会起作用。但是,然后我必须重建新的numpy数组,以利用数学函数在每个段上运行。有什么建议吗?根据数据的大小,您可能能够最后将其转换为数组即可:segments=array[list comprehension])。或者,您可以有点花哨,并结合其他功能/模块。我将使用numpy编辑我的帖子,以包含一个替代解决方案。
>>> segments
[[10, 20, 50, 40, 30, 10], [10, 20, 50, 40, 30, 10]]
>>>segments[0]
[10, 20, 50, 40, 30, 10]