4

閉じた境界条件で廊下を移動する粒子のデータがいくつかあります。軌道をプロットすると、ジグザグ軌道になります。 ここに画像の説明を入力してください

plot()パーティクルが最初に戻るポイントを接続するのを妨げる方法を知りたいです。写真の上部にあるようなものがありますが、"."

私が持っていた最初のアイデアは、numpy配列a[:-1]-a[1:]が正になるときにインデックスを見つけることです。そして、0からそのインデックスまでプロットします。しかし、?の正の要素の最初の出現のインデックスを取得するにはどうすればよいa[:-1]-a[1:]ですか?多分他のいくつかのアイデアがあります。

4

3 に答える 3

13

私は別のアプローチを取ります。まず、導関数の符号を見ずにジャンプポイントを決定します。おそらく、動きが上下したり、周期性があったりする可能性があるためです。私はそれらの点を最大の導関数で見ていきます。

第二に、プロットラインを中断するための洗練されたアプローチは、ジャンプごとに1つの値をマスクすることです。その後、matplotlibは自動的にセグメントを作成します。私のコードは次のとおりです。

import pylab as plt
import numpy as np

xs = np.linspace(0., 100., 1000.)
data = (xs*0.03 + np.sin(xs) * 0.1) % 1

plt.subplot(2,1,1)
plt.plot(xs, data, "r-")

#Make a masked array with jump points masked
abs_d_data = np.abs(np.diff(data))
mask = np.hstack([ abs_d_data > abs_d_data.mean()+3*abs_d_data.std(), [False]])
masked_data = np.ma.MaskedArray(data, mask)
plt.subplot(2,1,2)
plt.plot(xs, masked_data, "b-")

plt.show()

そして結果として私たちに与えます: ここに画像の説明を入力してください

もちろん、不利な点は、ブレークごとに1ポイントを失うことです。ただし、サンプリングレートを使用すると、これをより単純なコードと交換できると思います。

于 2013-01-16T12:50:27.377 に答える
3

パーティクルが上限を超えた場所を見つけるには、次のようにします。

>>> import numpy as np
>>> a = np.linspace(0, 10, 50) % 5
>>> a = np.linspace(0, 10, 50) % 5 # some sample data
>>> np.nonzero(np.diff(a) < 0)[0] + 1
array([25, 49])
>>> a[24:27]
array([ 4.89795918,  0.10204082,  0.30612245])
>>> a[48:]
array([ 4.79591837,  0.        ])
>>> 

np.diff(a)の離散差を計算し、条件が負の場所、つまり粒子が下に移動した場所anp.nonzero見つけます。np.diff(a) < 0

于 2013-01-16T11:40:51.013 に答える
2

接続線を避けるために、セグメントごとにプロットする必要があります。

a変化の導関数が符号を付けるときにセグメントごとにプロットする簡単な方法は次のとおりです。

import numpy as np
a = np.linspace(0, 20, 50) % 5  # similar to Micheal's sample data
x = np.arange(50)  # x scale

indices = np.where(np.diff(a) < 0)[0] + 1  # the same as Micheal's np.nonzero
for n, i in enumerate(indices):
    if n == 0:
        plot(x[:i], a[:i], 'b-')
    else:
        plot(x[indices[n - 1]:i], a[indices[n - 1]:i], 'b-')

ここに画像の説明を入力してください

于 2013-01-16T12:42:42.387 に答える