加速一个计算大数组中相邻元素平均值的程序

2024-10-03 15:31:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我对程序的速度有问题。我要计算一个大数组中四个邻居的平均数。这是我的一部分代码。你有什么办法改变最后一行吗?或者我应该使用另一个数组吗?在

for a in np.arange(100000):
    for x in np.arange(size):
        for y in np.arange(size):
            if unchangeableflag[x*size+y] == 0:
                vnew[x*size+y] = (v[(x+1)*size+y] + v[(x-1)*size+y] + v[x*size+y+1] + v[x*size+y-1]) / 4.0

Tags: 代码in程序forsizeifnp数组
3条回答

我不确定,但你可以去掉一些不变量。在

for a in np.arange(100000):
    for x in np.arange(size):
        for y in np.arange(size):
            t = x*size+y
            if unchangeableflag[t] == 0:
                vnew[t] = (v[t+size] + v[t-size] + v[t+1] + v[t-1]) / 4.0

你根本不需要这个循环。假设vvnew和{}是具有size*size条目的一维数组,可以这样做

v = v.reshape(size, size)
vnew = vnew.reshape(size, size)
unchangeableflag = unchangeableflag.reshape(size, size)
average = v[1:-1, 2:]
average += v[1:-1, :-2] 
average += v[2:, 1:-1]
average += v[-2:, 1:-1]
average /= 4.0
vnew[1:-1, 1:-1][unchangeableflag[1:-1, 1:-1] == 0] = average

但你到底想达到什么目的呢?这看起来很可疑,你可以逃脱一些应用离散拉普拉斯。在

(注意,这假设v包含浮点数。如果“v”的dtype是sime integral类型,则需要稍作修改。)

您应该考虑使用SciPy的convolution filter或{a2}。这仍然是计算密集型的,但比循环快得多。通常,在进行这种类型的平均时,还包括中心元素。请注意,这些解决方案也适用于多维数组。在

from scipy import ndimage
footprint = scipy.array([[0,0.25,0],[0.25,0,0.25],[0,0.25,0]])
filtered_array = scipy.convolve(array, footprint)

或者

^{pr2}$

相关问题 更多 >