我有以下代码来计算向下运动的粒子的轨迹:
c = -299792458
q = -1
m = 0.002
v_x = 0
v_y = 0
v_z = c*0.994
x_i,y_i,z_i = 1,1,100
v_xi,v_yi,v_zi = 1,1,v_z
h = 1e-12
timesteps = list(range(1,int(4e5)))
x,y,z = x_i,y_i,z_i
v_xi,v_yi,z_yi = v_xi,v_yi,v_zi
height = 1
radius = 0.1
B_r = 12
Vol = 0.790524
B = lambda x,y,z : (B_r*Vol)/(4*np.pi*np.sqrt(x**2 + y**2 + z**2))
B_x = lambda x,y,z : B(x,y,z)*(3*z*x)
B_y = lambda x,y,z : B(x,y,z)*(3*z*y)
B_z = lambda x,y,z : B(x,y,z)*(2*z**2 - x**2 - y**2)
def F_x(x,y,z,v_x,v_y,v_z):
return((q/(m*c))*(v_y*B_z(x,y,z) - v_z*B_y(x,y,z)))
def F_y(x,y,z,v_x,v_y,v_z):
return((q/(m*c))*(v_z*B_x(x,y,z) - v_x*B_z(x,y,z)))
def F_z(x,y,z,v_x,v_y,v_z):
return((q/(m*c))*(v_x*B_y(x,y,z) - v_y*B_x(x,y,z)))
p = np.zeros((len(timesteps)+1,3))
p[0,:] = [x_i,y_i,z_i]
v = np.zeros((len(timesteps)+1,3))
v[0,:] = [v_xi,v_yi,v_zi]
for i in range(len(timesteps)):
p[i+1,:] = p[i,:] + h*v[i,:]
v[i+1,0] = v[i,0] + h*F_x(*p[i,:],*v[i,:])
v[i+1,1] = v[i,1] + h*F_y(*p[i,:],*v[i,:])
v[i+1,2] = v[i,2] + h*F_z(*p[i,:],*v[i,:])
if p[i,2]<0:
break
字符串
我的代码生成了一个numpy.ndarray对象p,形状为(400000,3),包含粒子的坐标。我想只保留z坐标p[i:2]大于零的元素,因此删除p[i,2]<0的元素及其之后的所有[0,0,0]元素。
我尝试使用以下代码:
for i in p:
if p[i,2]==0:
np.delete(p,1,i)
型
但我得到“IndexError:用作索引的数组必须是整数(或布尔)类型”。如果有人能告诉我如何处理这个错误或一些替代代码,我可以用来做我想我会很感激。
1条答案
按热度按时间sczxawaw1#
行
np.delete(p,1,i)
在很多方面都是错误的。阅读文档。试试看
字符串