如何将一个圆形的面具应用到一个numpy数组?

我有一个这样的数组:

>>> np.ones((8,8)) array([[ 1., 1., 1., 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1., 1., 1., 1.]]) 

我正在创build一个半径为3的圆盘形面具:

 y,x = np.ogrid[-3: 3+1, -3: 3+1] mask = x**2+y**2 <= 3**2 

这给了:

 >> mask array([[False, False, False, True, False, False, False], [False, True, True, True, True, True, False], [False, True, True, True, True, True, False], [ True, True, True, True, True, True, True], [False, True, True, True, True, True, False], [False, True, True, True, True, True, False], [False, False, False, True, False, False, False]], dtype=bool) 

现在,我想能够将这个掩码应用到我的数组,使用任何元素作为中心点。 所以,例如,中心点在(1,1),我想获得一个数组,如:

 >>> new_arr array([[ True, True, True, True, 1., 1., 1., 1.], [ True, True, True, True, True, 1., 1., 1.], [ True, True, True, True, 1., 1., 1., 1.], [ True, True, True, True, 1., 1., 1., 1.], [ 1., True, 1., 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1., 1., 1., 1.]]) 

有一个简单的方法来应用这个面具?

编辑:我不应该有混合布尔和浮游物 – 这是误导。

 >>> new_arr array([[ 255., 255., 255., 255., 1., 1., 1., 1.], [ 255., 255., 255., 255., 255., 1., 1., 1.], [ 255., 255., 255., 255., 1., 1., 1., 1.], [ 255., 255., 255., 255., 1., 1., 1., 1.], [ 1., 255., 1., 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1., 1., 1., 1.]]) 

这是我需要的结果。

数组[掩码] = 255

将使用中心点(0 +半径,0 +半径)掩盖arrays。

但是,我希望能够在任何位置(y,x)放置任意大小的面具,并自动裁剪以适合其尺寸。

我会这样做,其中(a,b)是你的面具的中心:

 import numpy as np a, b = 1, 1 n = 7 r = 3 y,x = np.ogrid[-a:na, -b:nb] mask = x*x + y*y <= r*r array = np.ones((n, n)) array[mask] = 255 

我只是想和大家分享一下我刚才不得不面对的这个技术稍微更高级的应用。

我的问题是应用这个循环内核来计算2Dmatrix中每个点周围所有值的平均值。 生成的内核可以通过以下方式传递给scipy的通用filter:

 import numpy as np from scipy.ndimage.filters import generic_filter as gf kernel = np.zeros((2*radius+1, 2*radius+1)) y,x = np.ogrid[-radius:radius+1, -radius:radius+1] mask = x**2 + y**2 <= radius**2 kernel[mask] = 1 circular_mean = gf(data, np.mean, footprint=kernel) 

希望这可以帮助!

把它放在一个方便的function:

 def cmask(index,radius,array): a,b = index nx,ny = array.shape y,x = np.ogrid[-a:nx-a,-b:ny-b] mask = x*x + y*y <= radius*radius return(sum(array[mask])) 

返回半径内的像素和,或者返回(array [mask] = 2)。

你有没有尝试做一个面具或零和一个,然后使用每元素数组乘法? 这是规范的方式,或多或less。

另外,你确定你想要一个数组和布尔值在一个numpy数组混合? 顾名思义,NumPy最适合于数字。

你可以使用scipy的convolve函数,它可以让你在数组中的任意数量的坐标上放置任何特定的掩码,也就是内核:

 import numpy as np from scipy.ndimage.filters import convolve 

首先创build一个坐标数组,其坐标(核心)的中心标记为2

 background = np.ones((10,10)) background[5,5] = 2 print(background) [[ 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.] [ 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.] [ 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.] [ 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.] [ 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.] [ 1. 1. 1. 1. 1. 2. 1. 1. 1. 1.] [ 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.] [ 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.] [ 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.] [ 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]] 

创build你的面具:

 y,x = np.ogrid[-3: 3+1, -3: 3+1] mask = x**2+y**2 <= 3**2 mask = 254*mask.astype(float) print(mask) [[ 0. 0. 0. 254. 0. 0. 0.] [ 0. 254. 254. 254. 254. 254. 0.] [ 0. 254. 254. 254. 254. 254. 0.] [ 254. 254. 254. 254. 254. 254. 254.] [ 0. 254. 254. 254. 254. 254. 0.] [ 0. 254. 254. 254. 254. 254. 0.] [ 0. 0. 0. 254. 0. 0. 0.]] 

解开两个图像:

 b = convolve(background, mask)-sum(sum(mask))+1 print(b) [[ 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.] [ 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.] [ 1. 1. 1. 1. 1. 255. 1. 1. 1. 1.] [ 1. 1. 1. 255. 255. 255. 255. 255. 1. 1.] [ 1. 1. 1. 255. 255. 255. 255. 255. 1. 1.] [ 1. 1. 255. 255. 255. 255. 255. 255. 255. 1.] [ 1. 1. 1. 255. 255. 255. 255. 255. 1. 1.] [ 1. 1. 1. 255. 255. 255. 255. 255. 1. 1.] [ 1. 1. 1. 1. 1. 255. 1. 1. 1. 1.] [ 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]] 

请注意,卷积函数条目不通勤,即卷积(a,b)!= convolve(b,a)

还要注意的是,如果你的点在边缘附近,那么algorithm不会在坐标上重现内核。 为了解决这个问题,你可以通过内核的最大轴填充背景,应用卷积,然后删除填充。

现在,您可以将任何内核映射到数组中的任意数量的点,但请注意,如果两个内核重叠,则会在重叠处添加。 如果需要的话,你可以select这个门槛

为了得到与你的例子相同的结果,你可以做这样的事情:

 >>> new_arr = np.array(ones, dtype=object) >>> new_arr[mask[2:, 2:]] = True >>> print new_arr array([[True, True, True, True, 1.0, 1.0, 1.0, 1.0], [True, True, True, True, True, 1.0, 1.0, 1.0], [True, True, True, True, 1.0, 1.0, 1.0, 1.0], [True, True, True, True, 1.0, 1.0, 1.0, 1.0], [1.0, True, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]], dtype=object)