Edit,你必须使用numpy broadcasting:
m = (y[:, None] > 0) | (x > 0)
newZ = np.where(m, Z, 0)
# OR
m = (y[:, None] > 0) | (x > 0)
newZ = np.zeros(Z.shape)
newZ[m] = Z[m]
演示:
x = np.linspace(-1, 1, 11)
y = np.linspace(-1, 1, 6)
Z = np.arange(len(y)*len(x)).reshape(len(y), len(x))
m = (y[:, None] > 0) | (x > 0)
newZ = np.zeros(Z.shape, dtype=int)
newZ[m] = Z[m]
输出:
>>> x
array([-1. , -0.8, -0.6, -0.4, -0.2, 0. , 0.2, 0.4, 0.6, 0.8, 1. ])
>>> y
array([-1. , -0.6, -0.2, 0.2, 0.6, 1. ])
>>> Z
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21],
[22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32],
[33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43],
[44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54],
[55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65]])
>>> newZ
array([[ 0, 0, 0, 0, 0, 0, 6, 7, 8, 9, 10],
[ 0, 0, 0, 0, 0, 0, 17, 18, 19, 20, 21],
[ 0, 0, 0, 0, 0, 0, 28, 29, 30, 31, 32],
[33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43],
[44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54],
[55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65]])
masked array:
>>> np.ma.masked_array(Z, ~m, fill_value=0)
masked_array(
data=[[--, --, --, --, --, --, 6, 7, 8, 9, 10],
[--, --, --, --, --, --, 17, 18, 19, 20, 21],
[--, --, --, --, --, --, 28, 29, 30, 31, 32],
[33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43],
[44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54],
[55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65]],
mask=[[ True, True, True, True, True, True, False, False, False,
False, False],
[ True, True, True, True, True, True, False, False, False,
False, False],
[ True, True, True, True, True, True, False, False, False,
False, False],
[False, False, False, False, False, False, False, False, False,
False, False],
[False, False, False, False, False, False, False, False, False,
False, False],
[False, False, False, False, False, False, False, False, False,
False, False]],
fill_value=0)
IIUC,您要找的是np.where
:
newZ = np.where(Z>0, Z, 0)
相同于:
m = Z>0
newZ = np.zeros(Z.shape)
newZ[m] = Z[m]
np.clip
的替代方案:
newZ = np.clip(Z, 0, np.inf)