在Python中有效地在2DMap上执行扩散

jtjikinw  于 2023-02-28  发布在  Python
关注(0)|答案(3)|浏览(126)

我对Python还是个新手,所以我在做一个项目,其中一部分包括一个Map的扩散,我通过遍历并使当前瓦片等于.2 * 它的邻居n,w,s,e之和来实现它,如果我用C来做这个,我只需要做一个double for循环,循环遍历一个数组,执行arr[i*width + j] = arr of j+1,j-1,i+i,i-1表示邻居),并有几个不同的数组,我会对它们做同样的事情(我会改变Map的不同性质)。然而,我不确定这是否是Python中最快的方法。我问过一些人,他们建议使用numPy,但是宽度大概不会超过200(最大40- 50 k元素),我不确定是否值得这样做。我真的不知道任何内置函数来做我想要的。有什么建议吗?
编辑:这将是非常密集的,即每个点都将有一个重要的计算

fruv7luv

fruv7luv1#

这对于NumPy来说是非常简单的,函数np.roll返回数组的一个副本,在指定的方向上“滚动”。
例如,给定数组x

x=np.arange(9).reshape(3,3)
# array([[0, 1, 2],
#        [3, 4, 5],
#        [6, 7, 8]])

您可以使用将列向右滚动

np.roll(x,shift=1,axis=1)
# array([[2, 0, 1],
#        [5, 3, 4],
#        [8, 6, 7]])

使用np.roll,边界像在圆环上一样被包裹。如果你不想包裹边界,你可以用零的边填充数组,并在每次迭代之前将边重置为零。

import numpy as np

def diffusion(arr):
    while True:
        arr+=0.2*np.roll(arr,shift=1,axis=1) # right
        arr+=0.2*np.roll(arr,shift=-1,axis=1) # left
        arr+=0.2*np.roll(arr,shift=1,axis=0) # down
        arr+=0.2*np.roll(arr,shift=-1,axis=0) # up
        yield arr

N=5
initial=np.random.random((N,N))
for state in diffusion(initial):
    print(state)
    raw_input()
myzjeezk

myzjeezk2#

使用卷积。

from numpy import *
from scipy.signal import convolve2d

mapArr=array(map)
kernel=array([[0  , 0.2,   0],
              [0.2,   0, 0.2],
              [0  , 0.2,   0]])
diffused=convolve2d(mapArr,kernel,boundary='wrap')

这是蚂蚁的挑战吗?如果是的话,在蚂蚁的上下文中,convolve2d比我的实现中的循环快20倍。

vulvrdjw

vulvrdjw3#

对unutbu代码的修改使数组的全局和保持不变,同时扩散数组的值:

import numpy as np

        def diffuse(arr, d):
            contrib = (arr * d)
            w = contrib / 8.0
            r = arr - contrib
            N = np.roll(w, shift=-1, axis=0)
            S = np.roll(w, shift=1, axis=0)
            E = np.roll(w, shift=1, axis=1)
            W = np.roll(w, shift=-1, axis=1)
            NW = np.roll(N, shift=-1, axis=1)
            NE = np.roll(N, shift=1, axis=1)
            SW = np.roll(S, shift=-1, axis=1)
            SE = np.roll(S, shift=1, axis=1)
            diffused = r + N + S + E + W + NW + NE + SW + SE
            return diffused

相关问题