如何绘制条件为(r <1.5 * rs)的数组?

时间:2019-07-18 07:34:39

标签: python matplotlib plot

我正在编码绕黑洞运动的光子。当光子直接进入黑洞时,由于除以零,因此轨迹确实很奇怪。我想忽略r <1.5 * rs的阵列光子,但我不知道如何

我尝试在True时使用,如果它不起作用

h0=[t0, r2, theta, phi2, pt2, pr2, ptheta, pphi2] 

T = np.linspace(0, 1000, 9000)

zz=odeint(func, h0, T, args=(rs,))

r22 = zz[:, 1]
theta22 = zz[:, 2]
phi22 = zz[:, 3]
pt22 = zz[:, 4]
pr22 = zz[:, 5]
pphi22 = zz[:, 7]

def sph2cart(r, phi, theta):
    X = r * np.cos(phi) * np.sin(theta)
    Y = r * np.sin(phi) * np.sin(theta)
    Z = r * np.cos(theta)
    return(X, Y, Z)

X2, Y2, Z2 = sph2cart(r22, phi22, theta22)

plt.plot(X2, Y2, Z2, 'g')

我认为您并不是真的需要代码来帮助我,但是没有人知道如何绘制半径r <1.5 * rs(rs在代码中定义)的X2,Y2,Z2吗?

1 个答案:

答案 0 :(得分:2)

Numpy内置的口罩效果很好

r=np.arange(20)
r_mask = np.ma.masked_where(r < 10 , r)

因此,由于您只想在r <1.5 * rs时生成X,Y和Z值(我认为您曾在某一点上相反地说道,但是无论如何您只需要翻转符号),您的代码可能如下所示

import numpy as np
h0=[t0, r2, theta, phi2, pt2, pr2, ptheta, pphi2] 

T = np.linspace(0, 1000, 9000)

zz=odeint(func, h0, T, args=(rs,))

r22 = zz[:, 1]
theta22 = zz[:, 2]
phi22 = zz[:, 3]
pt22 = zz[:, 4]
pr22 = zz[:, 5]
pphi22 = zz[:, 7]

def sph2cart(r, phi, theta):
    X = r * np.cos(phi) * np.sin(theta)
    Y = r * np.sin(phi) * np.sin(theta)
    Z = r * np.cos(theta)
    return(X, Y, Z)

r22_masked = np.ma.masked_where(r22 > 1.5*rs , r22)

X2, Y2, Z2 = sph2cart(r22_masked, phi22, theta22)

这只会为r22的未屏蔽值生成X2,Y2和Z2值(又名r22小于1.5 * rs