从numpy.ndarray中删除元素

uqzxnwby  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(140)

我有以下代码来计算向下运动的粒子的轨迹:

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:用作索引的数组必须是整数(或布尔)类型”。如果有人能告诉我如何处理这个错误或一些替代代码,我可以用来做我想我会很感激。

sczxawaw

sczxawaw1#

np.delete(p,1,i)在很多方面都是错误的。阅读文档。
试试看

mask = p[:, 2] != 0
p = p[mask]

字符串

相关问题