使用for循环查找索引

时间:2019-05-30 12:25:07

标签: python numpy

我应该使用F = V.B力来估计B场对粒子偏转的影响。

我有一个nx和ny的2D网格,表示每个方向上的点数.B是磁场,它是2D网格阵列(尺寸nx.ny = 1600.900 = 1440000),V是速度是一个1D数组(尺寸为431605462)。我也有两个一维数组(与V数组的维数相同),分别显示每个粒子的X和y坐标。我称它们为“ grid_pro_x”和“ grid_pro_y”。

由于V是一维数组,而B是2D数组,所以我不能直接将V与B相乘。为解决此问题,我为V创建了一个二维零数组,并使用2进行循环,我发现了每个单元格中都存在的粒子的网格。我将所有粒子的平均速度视为每个单元的速度分量。由于网格的尺寸较大,如果我保持原始尺寸,则代码需要几天才能完成V数组,因为它需要重复1440000次。 作为解决方案,我使用称为“ divider”的可选变量压缩了V。如果我使用divider = 10,我猜代码需要2天才能完成,如果我使用divider = 100,代码将在半小时内完成,但是现在结果的精度大大降低了。您可以在下面看到代码。

nx,ny= 1600, 900

xmin = -30.0e-6       
xmax =  50.0e-6   

ymin = -45.0e-6    
ymax = 45.0e-6 

#### create a 2D  velocity array

divider = 100
m_p= 1.6726219e-27   #  (kg unit)  proton mass

nx_new = nx/divider
ny_new = ny/divider 

Vx = np.zeros((ny_new, nx_new))
Vy = np.zeros((ny_new, nx_new))

res_x = (xmax - xmin)/nx_new   # resolution in x direction
res_y = (ymax - ymin)/ny_new   # resolution in y direction

  #   Find corresponding indices 

  for i in range( 0,ny_new ):                  
     for j in range(  0,nx_new):                

        xx = i*res_x    
        yy = j*res_y 

  ##### all particles with different Px confined in a specific cell

        Px_pro_lim = Px_pro[(grid_pro_x >=  xx ) & (grid_pro_x < xx+res_x ) & (grid_pro_y >=  yy ) & (grid_pro_y < yy+res_y ) ] 

        Vx[i,j] = np.mean(Px_pro_lim)/m_p 
  #print 'Vx[i,j]= ' ,Vx[i,j]

您对提高代码效率是否有任何建议,或者是否有其他算法可以为V参数找到2D数组?

欢呼

0 个答案:

没有答案