在 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]])
这个问题是关于: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]])