python - 如何将圆盘形掩码应用于 NumPy 数组?

标签 python arrays numpy mask

我有一个这样的数组:

>>> 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.]])

我正在创建一个半径为 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.]])

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

编辑:我不应该混合 bool 值和 float - 这是误导。

>>> 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.]])

这更多是我需要的结果。

array[mask] = 255 

将使用中心点 (0+radius,0+radius) 屏蔽阵列。

但是,我希望能够在任何点 (y,x) 放置任何尺寸的蒙版,并使其自动修剪以适应。

最佳答案

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

import numpy as np

a, b = 1, 1
n = 7
r = 3

y,x = np.ogrid[-a:n-a, -b:n-b]
mask = x*x + y*y <= r*r

array = np.ones((n, n))
array[mask] = 255

关于python - 如何将圆盘形掩码应用于 NumPy 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8647024/

相关文章:

python - 在 numpy 中更新整数索引切片的快速方法

python - Kinect + Python - 阴影的填充深度

c++ - 字符数组不符合新的大小

javascript - 删除数组中的 JSON 数据

iphone - iOS5 JSON 基础知识

python - 将一列添加到 numpy 数组

python - 从子进程中分离 matplotlib 窗口

python - 错误代码 : 'return' outside function

python - asyncio.run 在 loop.run_until_complete 工作时失败

python - 用于确定两个数字在舍入到 n 个有效十进制数字时是否几乎相等的函数