Chi*_*ion 5 python arrays numpy numpy-broadcasting
我有一个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
Run Code Online (Sandbox Code Playgroud)
Div*_*kar 10
嗯,这是一个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
Run Code Online (Sandbox Code Playgroud)
此特定操作是OpenCV模块内置的,cv2.blur并且非常高效.该名称基本上描述了模糊表示图像的输入数组的操作.我相信效率来自这样一个事实,即内部完全C通过一个瘦的Python包装来实现性能,以处理NumPy数组.
所以,输出也可以用它来计算,就像这样 -
import cv2 # Import OpenCV module
out = cv2.blur(a.astype(float),(3,3))
Run Code Online (Sandbox Code Playgroud)
这是一个关于大图像/阵列的时间的快速显示 -
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
Run Code Online (Sandbox Code Playgroud)