如何针对Python中的散热问题对代码进行矢量化处理?

时间:2019-05-19 02:25:51

标签: python numpy for-loop vectorization

我正在尝试将下面的代码向量化,但是我不知道如何开始。问题是编写给定numpy数组的代码。 2D数组包含表示正面轮廓上钢温度的元素。如果热夹作用在钢上,则元件的外圈代表温度。它们保持不变,但是内部元素/温度将在t秒后改变。目的是在1的时间步返回数组。等式描述了t秒后元素将发生什么。

()=((−1)[+1,] + (−1) [−1,] +(−1)[,+1] + (−1)[,−1])/ 4

方括号包含元素的位置。一切都是有帮助的。谢谢!

#u is the numpy array
arr = np.copy(u)
for i in range(len(u)):
    for j in range(len(u[i])):
        if i == 0 or i == (len(u) - 1) or j == 0 or j == (len(u[i]) - 1):
            continue
        else:
            arr[i][j] = (u[i + 1][j] + u[i - 1][j] + u[i][j + 1] + u[i][j - 1]) / 4
return arr

例如: 例如,数组:

100   100   100   100   100  
100    0     0     0    100  
100    0     0     0    100  
100    0     0     0    100  
100   100   100   100   100  

上面的数组返回数组:

100   100   100   100   100  
100    50    25    50   100   
100    25     0    25   100  
100    50    25    50   100  
100   100   100   100   100  

经过1个时间步长

1 个答案:

答案 0 :(得分:0)

您将关闭,以更改numpy数组numpy indexing的元素以进行赋值。仅此一项就可以解决您的问题。 (使用arr[i, j] =代替arr[i][j] =) 我对您的代码的另一种评论是使用range function。通过限制数组的索引而不是检查其不允许的索引,可以简化并提高可读性。看看我的例子:

def timestep(arr):
    rval = np.copy(arr)

    for row in range(1, arr.shape[0] - 1):  # arr.shape returns (width, height)
        for col in range(1, arr.shape[1] - 1):
            rval[row, col] = (arr[row-1, col] + arr[row+1, col] + arr[row, col-1] + arr[row, col+1]) / 4
    return rval

print(arr)
print(timestep(arr))

此输出

[[100 100 100 100 100]
 [100   0   0   0 100]
 [100   0   0   0 100]
 [100   0   0   0 100]
 [100 100 100 100 100]]
[[100 100 100 100 100]
 [100  50  25  50 100]
 [100  25   0  25 100]
 [100  50  25  50 100]
 [100 100 100 100 100]]

以您的示例为例。