屏蔽 python 二维数组以在特定阈值下更改圆中的值

masking a python 2d array to change values in a circle under a certain threshold

正如标题所说,我正在尝试更改二维数组中满足特定条件的圆的值。到目前为止,我从这里的 得到了这个:

import numpy as np

x = np.arange(0, 20)
y = np.arange(0, 20)
arr = np.zeros((y.size, x.size))

cx = 10.
cy = 10.
r = 4.

mask = (x[np.newaxis, :] - cx) ** 2 + (y[:, np.newaxis] - cy) ** 2 < r ** 2
arr[mask] = 1

cxcy是圆心的坐标,r是它的半径。 mask 包含圆圈,其中的所有元素都设置为 1,效果很好。我想做的是仅当它们小于 5 或​​任何类似条件时才更改它们的值。显然这个数组只有0,但我的真实数据会预先设置其他值。

掩码是布尔值,您可以使用按位运算或逻辑运算将它们与其他掩码组合:

circle_mask = (x[np.newaxis, :] - cx) ** 2 + (y[:, np.newaxis] - cy) ** 2 < r ** 2
less_than_5_mask = arr < 5

arr[circle_mask & less_than_5_mask] = 1

在这种情况下,& 是按位、按元素的布尔 AND 运算符。如果您想替换圆 and/or 中小于 5 的位置,您可以改用 | 运算符。

在这种情况下,

&np.bitwise_and 更快。由于您的数组是布尔值,因此您可以使用 np.logical_and 达到相同的效果。请注意,这与使用 and 运算符 not 相同,因为该运算符将尝试将整个数组提取为单个布尔值,从而导致错误。