屏蔽 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
cx
和cy
是圆心的坐标,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 相同,因为该运算符将尝试将整个数组提取为单个布尔值,从而导致错误。
正如标题所说,我正在尝试更改二维数组中满足特定条件的圆的值。到目前为止,我从这里的
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
cx
和cy
是圆心的坐标,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 相同,因为该运算符将尝试将整个数组提取为单个布尔值,从而导致错误。