我有这两个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)
但这会连接一行中的所有点。例如,我不希望a = 5且b = -4的点与a = 8且b = -3的点相连
答案 0 :(得分:2)
你可以使用mask array:
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)
然而,我认为这可能不是你想要的。这是一种快速方法,可以将线分为两部分:
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)