0

私はこれらの2つのnumpy配列を持っています

  import numpy as np
  a=np.array([1,2,3,4,5,6,7,8,9])
  b=np.array([-1,-2,-3,-4,-5,1,2,-3,-4])

そのように簡単にプロットできます

  from pylab import *
  plot(a,b,'b-',lw=2)

b破線など、異なる線種で負の点を表示したいと思います。

私はこれを行うことができました

 plot(a[(b<0)],b[(b<0)],'b--',lw=2)

しかし、これはすべての点を 1 本の線で結びます。たとえば、a=5 と b=-4 のポイントを a=8 と b=-3 のポイントに接続したくありません。

4

1 に答える 1

2

マスク配列を使用できます:

import numpy as np
a=np.array([1,2,3,4,5,6,7,8,9])
b=np.array([-1,-2,-3,-4,-5,1,2,-3,-4])

plot(a, b)
m = b > 0
plot(np.ma.array(a, mask=m), np.ma.array(b, mask=m), 'r--', lw=2)

ここに画像の説明を入力

ただし、これはおそらくあなたが望むものではないと思います。行を 2 つの部分に分割できる簡単な方法を次に示します。

import numpy as np
a=np.array([1,2,3,4,5,6,7,8,9])
b=np.array([-1,-2,-3,-4,-5,1,2,-3,-4])

x = np.linspace(a.min(), a.max(), 1000)
y = np.interp(x, a, b)

m = y <= 0
plot(np.ma.array(x, mask=m), np.ma.array(y, mask=m), 'b-', lw=2)
m = y > 0
plot(np.ma.array(x, mask=m), np.ma.array(y, mask=m), 'r--', lw=2)

ここに画像の説明を入力

np.interp()大規模なデータセットには多くのメモリを使用します。すべてのゼロ点を見つける別の方法を次に示します。出力は上記と同じです。

idx1 = np.where(b[1:] * b[:-1] < 0)[0]
idx2 = idx1 + 1

x0 = a[idx1] + np.abs(b[idx1] / (b[idx2] - b[idx1])) * (a[idx2] - a[idx1]) 

a2 = np.insert(a, idx2, x0)
b2 = np.insert(b, idx2, 0)

m = b2 < 0
plot(np.ma.array(a2, mask=m), np.ma.array(b2, mask=m), 'b-', lw=2)
m = b2 > 0
plot(np.ma.array(a2, mask=m), np.ma.array(b2, mask=m), 'r--', lw=2)
于 2013-04-05T11:48:33.143 に答える