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

開始(開始するすべてのインデックス)を1つの配列に記録し、停止を別の配列に記録することによって、各ステップがいつ開始および停止するかを決定します。

開始=(4 15)

停止=(9 20)

質問:ここで、各ステップの実際のデータを初期配列からスライスし、それらを列に分けたいと思います。

[注:必要に応じて、開始配列または停止配列のデータ量によって実行されるステップ数がわかっています。]

10 10

20 20

50 50

40 40

30 30

10 10

これらの開始インデックスと停止インデックスを使用して初期配列をスライスする方法がわかりません。または、ステップをスライスするためのフィルター関数が見つかりませんでした。

ところで(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

4 に答える 4

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() 詳細

于 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 に答える
1

Pythonリストは角かっこで定義されており、リストのリストを生成したいと考えています(各部分には定義されたセグメントの1つが含まれています)。コンピューターは0からカウントを開始するため、「4番目の要素が開始」は配列インデックス=3に変換されます。

1つの癖は、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.isliceを使用)。しかし、より優れたソリューションが機能したとしても、配列に変換するよりも速度が大幅に向上するかどうかはわかりません。また、簡潔さははるかに劣ります。参照:ジェネレーターからnumpy配列を作成するにはどうすればよいですか?itertools.chainnumpy.fromiter

于 2012-05-30T03:48:39.740 に答える