gpt4 book ai didi

python - Numpy:用相邻元素的平均值替换数组中的每个值

转载 作者:太空狗 更新时间:2023-10-30 00:29:18 25 4
gpt4 key购买 nike

我有一个 ndarray,我想用相邻元素的平均值替换数组中的每个值。下面的代码可以完成这项工作,但是当我有 700 个形状都为 (7000, 7000) 的数组时它非常慢,所以我想知道是否有更好的方法来做到这一点。谢谢!

a = np.array(([1,2,3,4,5,6,7,8,9],[4,5,6,7,8,9,10,11,12],[3,4,5,6,7,8,9,10,11]))
row,col = a.shape
new_arr = np.ndarray(a.shape)
for x in xrange(row):
for y in xrange(col):
min_x = max(0, x-1)
min_y = max(0, y-1)
new_arr[x][y] = a[min_x:(x+2),min_y:(y+2)].mean()
print new_arr

最佳答案

嗯,那是一个 smoothing operation in image processing ,这可以通过 2D 卷积来实现。你在近边界元素上的工作有点不同。因此,如果为了精度而忽略了边界元素,您可以使用 scipy's convolve2d像这样 -

from scipy.signal import convolve2d as conv2

out = (conv2(a,np.ones((3,3)),'same')/9.0

此特定操作是内置于 OpenCV 模块中的 cv2.blur并且非常有效率。该名称基本上描述了其模糊表示图像的输入数组的操作。我相信效率来自于这样一个事实:它在内部完全在 C 中实现,以使用薄的 Python 包装器来处理 NumPy 数组以提高性能。

所以,输出也可以用它来计算,就像这样-

import cv2 # Import OpenCV module

out = cv2.blur(a.astype(float),(3,3))

这是一个关于相当大的图像/数组的时间的快速展示 -

In [93]: a = np.random.randint(0,255,(5000,5000)) # Input array

In [94]: %timeit conv2(a,np.ones((3,3)),'same')/9.0
1 loops, best of 3: 2.74 s per loop

In [95]: %timeit cv2.blur(a.astype(float),(3,3))
1 loops, best of 3: 627 ms per loop

关于python - Numpy:用相邻元素的平均值替换数组中的每个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38232497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com