【问题标题】:Python numpy vectorization for heat dispersion用于散热的 Python numpy 矢量化
【发布时间】:2020-06-08 05:42:11
【问题描述】:

我应该使用下面给出的有限差分公式编写代码来表示热扩散。

????(????)????????=(????(????−1)[????+1,????] + ????(????−1) [????−1,????] +????(????−1)[????,????+1] + ????(????−1)[????,????−1])/4 该公式应该仅在 1 的时间步长内产生结果。因此,如果给出这样的数组:

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

时间步长 1 的结果数组将是:

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

我知道使用 for 循环的表示形式如下,其中数组至少有 2 行和 2 列作为前提条件:

h = np.copy(u)
for i in range(1,h.shape[0]-1):
    for j in range (1, h.shape[1]-1):
        num = u[i+1][j] + u[i-1][j] + u[i][j+1] + u[i][j-1]
        h[i][j] = num/4

但我无法弄清楚如何对代码进行矢量化以表示散热。我应该使用 numpy 数组和矢量化,并且不允许使用任何类型的循环,我认为我应该依赖切片,但我不知道如何写出来并开始使用。

r, c = h.shape
if(c==2 or r==2):
    return h

我确定如果 rows=2 或 columns =2 则数组按原样返回,但如果我错了,请纠正我。任何帮助将不胜感激。谢谢!

【问题讨论】:

    标签: python numpy vectorization heat


    【解决方案1】:

    试试:

    h[1:-1,1:-1] = (h[2:,1:-1] + h[:-2,1:-1] + h[1:-1,2:] + h[1:-1,:-2]) / 4
    

    此解决方案使用切片,其中:

    • 1:-1 停留在索引 1,2, ..., LAST - 1
    • 2: 停留 2、3、...、LAST
    • :-2 停留 0, 1, ..., LAST - 2

    在每次迭代期间,仅更新内部元素(索引 1..LAST-1)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-16
      • 1970-01-01
      • 2018-03-17
      • 1970-01-01
      • 2013-08-01
      • 1970-01-01
      相关资源
      最近更新 更多