在 python 中应用具有周期性边界条件的圆形掩膜

Applying circular mask with periodic boundary conditions in python

这个问题是关于:How to apply a disc shaped mask to a numpy array?

从解决方案:,是否可以通过以下方式获得圆形掩码:

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

以数组环绕其列和行的方式?

一种方法是在数组的中心创建所需大小的掩码,然后使用 np.roll 沿轴移动掩码(这会导致掩码环绕阵列的边缘数组).

按照链接问答中的方法:

ones = np.ones((8, 8))

a, b = 3, 3
n = 8
r = 3
mask = x**2 + y**2 <= r**2

这样构造 mask

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

然后滚动 mask 两个位置和两个位置并在 ones...

上使用它
>>> rolled_mask = np.roll(np.roll(mask, -2, axis=0), -2, axis=1)
>>> ones[rolled_mask] = 255
>>> ones
array([[ 255.,  255.,  255.,  255.,    1.,    1.,    1.,  255.],
       [ 255.,  255.,  255.,  255.,  255.,    1.,  255.,  255.],
       [ 255.,  255.,  255.,  255.,    1.,    1.,    1.,  255.],
       [ 255.,  255.,  255.,  255.,    1.,    1.,    1.,  255.],
       [   1.,  255.,    1.,    1.,    1.,    1.,    1.,    1.],
       [   1.,    1.,    1.,    1.,    1.,    1.,    1.,    1.],
       [   1.,  255.,    1.,    1.,    1.,    1.,    1.,    1.],
       [ 255.,  255.,  255.,  255.,    1.,    1.,    1.,  255.]])

如果你想直接创建蒙版,以下工作:

>>> N = 10
>>> row, col = 8, 7
>>> radius = 4
>>> rows = np.arange(N) - row
>>> rows = np.minimum(np.abs(rows), rows % N)
>>> cols = np.arange(N) - col
>>> cols = np.minimum(np.abs(cols), cols % N)
>>> (rows[:, None]**2 + cols**2 <= radius**2).astype(int)
array([[1, 0, 0, 0, 1, 1, 1, 1, 1, 1],
       [0, 0, 0, 0, 0, 1, 1, 1, 1, 1],
       [0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
       [0, 0, 0, 0, 0, 1, 1, 1, 1, 1],
       [1, 0, 0, 0, 1, 1, 1, 1, 1, 1],
       [1, 0, 0, 0, 1, 1, 1, 1, 1, 1],
       [1, 1, 0, 1, 1, 1, 1, 1, 1, 1],
       [1, 0, 0, 0, 1, 1, 1, 1, 1, 1]])