【发布时间】:2020-12-11 06:59:13
【问题描述】:
谁能向我解释以下结果? 我知道它不像通常那样做这个操作,但我发现这个结果很奇怪。
import numpy as np
a = np.ma.masked_where(np.arange(20)>10,np.arange(20))
b = np.ma.masked_where(np.arange(20)>-1,np.arange(20))
c = np.zeros(a.shape)
d = np.zeros(a.shape)
c[~a.mask] += b[~a.mask]
print(b[~a.mask])
#masked_array(data=[--, --, --, --, --, --, --, --,--, --, --],
# mask=[ True, True, True, True, True, True, True, True, True, True, True],
# fill_value=999999,
# dtype=int64)
print(c)
#[ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
d[~a.mask] = d[~a.mask] + b[~a.mask]
print(d)
#[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
我预计c 不会改变,但我想这里有一些与内存中的对象相关的事情。此外,+= 保留原始对象,而= 和+ 创建一个新的d。
我只是不太明白添加到c 的数据来自哪里。
【问题讨论】:
-
添加到
c的数据来自b而不是a(如果你给他们不同的值可以看出),但是有一些奇怪的东西np.ndarray.__iadd__会忽略另一个数组的掩码,而np.ndarray.__add__将考虑掩码。不过,还有一个比c[~a.mask] += b[~a.mask]更简单的例子。只需c += b。布尔切片不是这种行为的基础。 -
如果
c本身是一个掩码数组,您会得到预期的结果。但由于它是一个普通数组,+=是用b.data执行的。一般来说,不要混合屏蔽和未屏蔽的操作和数组。如果要保留遮罩的效果,请使用遮罩的方法和函数。 -
谢谢。是的,使用 b.data 是有道理的。正如我所提到的,我确实在我的真实(更复杂)脚本中使用了一个掩码数组作为占位符(问题中的 c)。
标签: python arrays numpy numpy-ndarray masked-array