Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将圆盘状遮罩应用于NumPy阵列中的多个位置_Python_Arrays_Numpy_Scipy_Vectorization - Fatal编程技术网

Python 将圆盘状遮罩应用于NumPy阵列中的多个位置

Python 将圆盘状遮罩应用于NumPy阵列中的多个位置,python,arrays,numpy,scipy,vectorization,Python,Arrays,Numpy,Scipy,Vectorization,我有一个问题与这里的问题类似:。但是,与屏蔽单个圆形扇区不同,我希望创建一个具有多个圆形扇区的屏蔽(数字是可变的)。这些遮罩都具有相同的半径,但中心不同。这些中心的坐标存储在numpy 2d阵列中。例如: maskcenters = array([[1, 1], [7, 2], [2, 8]]) 现在,要围绕一个中心创建一个圆形遮罩(半径2),我可以简单地使用以下给出的解决方案: 但是,我有一个可变数量的中心,我想围绕这些中心创建遮罩。我知道如何使用for循环创建多个圆形遮罩,但这

我有一个问题与这里的问题类似:。但是,与屏蔽单个圆形扇区不同,我希望创建一个具有多个圆形扇区的屏蔽(数字是可变的)。这些遮罩都具有相同的半径,但中心不同。这些中心的坐标存储在numpy 2d阵列中。例如:

maskcenters = array([[1, 1],
   [7, 2],
   [2, 8]])
现在,要围绕一个中心创建一个圆形遮罩(半径2),我可以简单地使用以下给出的解决方案:

但是,我有一个可变数量的中心,我想围绕这些中心创建遮罩。我知道如何使用for循环创建多个圆形遮罩,但这会减慢代码的速度。使用10x10阵列中的示例掩模中心,我的最佳结果是:

#output
array([[ True,  True,  True, False, False, False, False, False,  True],
   [ True,  True,  True,  True, False, False, False,  True,  True],
   [ True,  True,  True, False, False, False,  True,  True,  True],
   [False,  True, False, False, False, False, False,  True,  True],
   [False, False, False, False, False, False, False, False,  True],
   [False, False,  True, False, False, False, False, False, False],
   [False,  True,  True,  True, False, False, False, False, False],
   [ True,  True,  True,  True,  True, False, False, False, False],
   [False,  True,  True,  True, False, False, False, False, False]], dtype=bool)
知道如何在不使用循环的情况下创建此掩码吗?

您可以使用磁盘形状的内核,如下所示-

# Define inputs
maskcenters = np.array([
   [1, 1],
   [7, 2],
   [2, 8]])

out_shp = (10,10) # Output array shape
r = 2 # Radius of circles

# Get a disk kernel
X,Y = [np.arange(-r,r+1)]*2
disk_mask = X[:,None]**2 + Y**2 <= r*r

# Initialize output array and set the maskcenters as 1s 
out = np.zeros(out_shp,dtype=bool)
out[maskcenters[:,0],maskcenters[:,1]] = 1

# Use binary dilation to get the desired output
out = binary_dilation(out,disk_mask)

下面是另一种使用-

X,Y=[np.arange(-r,r+1)]*2

disk_mask=X[:,None]**2+Y**2=0)和(absidxR=0)和(absidxC非常感谢,这是一个完美的方法!除了此方法比循环通过我所有的中心点来创建掩码更耗时之外。可能是因为我的掩码的形状为1400x1400。最初大约需要0.35秒,使用此方法大约需要10秒(0.35可能看起来很低,但我必须创建许多遮罩)@WilmarvanOmmeren您通常要处理多少个
maskcenters
点?如果是一个小数字,那么循环解决方案可能更适合。我仍在使用一个子集来测试我的算法。对,我知道我大约有15000个点,而使用完整的数据集,我可能会有数百万个点(有趣的事实:这些点代表我研究区域的树木中心)。@WilmarvanOmmeren补充了另一种方法。看看是否更好?
#output
array([[ True,  True,  True, False, False, False, False, False,  True],
   [ True,  True,  True,  True, False, False, False,  True,  True],
   [ True,  True,  True, False, False, False,  True,  True,  True],
   [False,  True, False, False, False, False, False,  True,  True],
   [False, False, False, False, False, False, False, False,  True],
   [False, False,  True, False, False, False, False, False, False],
   [False,  True,  True,  True, False, False, False, False, False],
   [ True,  True,  True,  True,  True, False, False, False, False],
   [False,  True,  True,  True, False, False, False, False, False]], dtype=bool)
# Define inputs
maskcenters = np.array([
   [1, 1],
   [7, 2],
   [2, 8]])

out_shp = (10,10) # Output array shape
r = 2 # Radius of circles

# Get a disk kernel
X,Y = [np.arange(-r,r+1)]*2
disk_mask = X[:,None]**2 + Y**2 <= r*r

# Initialize output array and set the maskcenters as 1s 
out = np.zeros(out_shp,dtype=bool)
out[maskcenters[:,0],maskcenters[:,1]] = 1

# Use binary dilation to get the desired output
out = binary_dilation(out,disk_mask)
In [64]: print out
[[ True  True  True False False False False False  True False]
 [ True  True  True  True False False False  True  True  True]
 [ True  True  True False False False  True  True  True  True]
 [False  True False False False False False  True  True  True]
 [False False False False False False False False  True False]
 [False False  True False False False False False False False]
 [False  True  True  True False False False False False False]
 [ True  True  True  True  True False False False False False]
 [False  True  True  True False False False False False False]
 [False False  True False False False False False False False]]
X,Y = [np.arange(-r,r+1)]*2
disk_mask = X[:,None]**2 + Y**2 <= r*r
Ridx,Cidx = np.where(disk_mask)

out = np.zeros(out_shp,dtype=bool)

absidxR = maskcenters[:,None,0] + Ridx-r
absidxC = maskcenters[:,None,1] + Cidx-r

valid_mask = (absidxR >=0) & (absidxR <out_shp[0]) & \
             (absidxC >=0) & (absidxC <out_shp[1])

out[absidxR[valid_mask],absidxC[valid_mask]] = 1