此问题与:How to apply a disc shaped mask to a numpy array?
有关从解决方案:https://stackoverflow.com/a/8650741/4484153,是否可以通过以下方式获得圆形掩模:
>>> 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]])
以这种方式使数组包裹其列和行?
答案 0 :(得分:3)
一种方法可能是在数组的中心创建所需大小的掩码,然后使用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.]])
答案 1 :(得分:1)
如果您想直接创建蒙版,以下作品:
>>> 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]])