如何将非矢量化 for 循环转换为矢量化格式?

How to convert non-vectorized for loop to vectorized format?

我正在尝试将 for 循环(如下)转换为矢量化格式,目的是提高计算速度。

a1,b1,c1的值都是常量。

如何将 for 循环转换为矢量化格式?

注:

  1. 虽然我知道将 for 循环转换为矢量化格式会提高效率,但我希望通过更改 while 和 for 循环进一步提高速度的指示

  2. 如果阅读 material(或其他资源)可以提供将非矢量化代码转换为矢量化代码的背景知识,我将不胜感激

     T = np.zeros((int(time/dt)+2, N+1)) #setting up Temperature - Position array
    
     n = 0 #setting position equal to 0 (initial position)
     # Initial Condition
     T[n, :] = T0 #setting T = T0 at t=0 for all positions (initial temperature array)
     # Boundary Condition
     T[:, 0] =  T_in #setting all times at n=0 to inlet fluid temperature
    
     while t <= time: #running simulation until required simulation time
         for i in range(1,N): #solving for temperature at every increment
             T[n+1,i] = T[n,i] + a1*T[n,i+1] - b1*T[n,i] + c1*T[n,i-1] #using three nodes (i-1,i,i+1) at time n to solve for 
                                                                       #temperature at n+1, position i
    
         T[n+1,-1]  = T[n+1,-2] #setting final position temperature equal to second last temperature
         T[n+1, 0] =  T_in #resetting position 0 as inlet fluid temperature
         n = n + 1 #incrementing position
         t = t + dt #incrementing time
    

你可以试试这个:

T = np.empty((int(time / dt), N + 1))  #setting up Temperature - Position array

# Initial Condition
T[0, :] = T0  
# Boundary Condition
T[:, 0] = T_in

for n in range(0, T.shape[0] - 1):
    T[n + 1, 1:N] = c1 * T[n, :N - 1] + (1 - b1) * T[n, 1:N] + a1 * T[n, 2:]
    T[n + 1, -1] = T[n + 1, -2]

不需要 while 循环。数组 T 的行数是这样选择的,当您遍历该数组的所有行时,条件 t <= time 将得到满足。我没有看到避免剩余 for 循环的简单方法,因为您正在递归计算每一行。