簡體   English   中英

從Python中的另一個數組切片給定范圍的數組

[英]Slice Array Given Range from another array in Python

更清楚地說,讓我改寫我最初在下面提出的問題。

我有一系列的數據點,隨着某人邁出一步,然后又邁出一步,幅度在上升和下降。 零是指腳離開地面。

一個簡單的示例如下所示:

 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數組中的數據量所采取的步驟數。

10 10

20 20

50 50

40 40

30 30

10 10

我不知道如何使用這些開始和停止索引來切片初始數組。 或者,我沒有找到過濾器功能以分拆步驟。

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)提取data_array中的所有這些值以獲取此信息:

new_array = (50,40,30)

謝謝,斯科特

我不了解您嘗試執行此操作的方式,但是可以使用filter嗎:

>>> data_array = (0,0,0,10,20,50,40,30,10,0)
>>> filter(lambda x: x>20,data_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列表或可迭代,請使用內置的slice函數

>>> 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]

Python列表用方括號定義,我們想生成一個列表列表(其中每段都包含一個定義的段)。 由於計算機從0開始計數,因此“第四個元素是開始”轉換為數組索引= 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.isliceitertools.chainnumpy.fromiter等配合使用)。 但是,即使更出色的解​​決方案行得通,但我不確定與轉換為陣列相比,它是否具有明顯的速度優勢,而且不夠簡潔。 請參閱: 如何從生成器構建numpy數組?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM