我对Python很陌生,所以我在里面做一个项目。其中一部分包括地图上的扩散。我通过遍历并使当前的tile等于它的邻居n,w,s,e的和来实现它。如果我在C中这样做,我只需要做一个double for循环,循环通过一个数组,arr[I*width+j]=arr of j+1,j-1,I+I,I-1 the neighbors),并且有几个不同的数组,我会做相同的事情(不同的质量我要换的地图)。但是,我不确定这是否真的是Python中最快的方法。我问过一些人,他们建议使用numPy之类的东西,但是宽度可能不会超过200(所以最多40-50k个元素),我不确定开销是否值得。我真的不知道有什么内置函数可以做我想做的事情。有什么建议吗?
编辑:这将是非常密集的,即每个点都将有一个非常重要的计算

最佳答案

使用NumPy进行排列非常简单。函数np.roll返回数组的一个副本,按指定方向“rolled”。
例如,给定数组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,边界被包裹在一个圆环上。如果不需要换行边界,可以在数组中填充一条0的边,并在每次迭代之前将该边重置为0。
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()

关于python - 在Python中的2d map 上有效地进行扩散,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8102781/

10-14 19:20
查看更多