受到接受的答案的启发,我找到了一种合并蒙版数组的简单方法。它可以在掩码上进行一些逻辑操作,并简单地添加0填充的数组。
import numpy as np
a = np.zeros((1000, 1000), dtype=np.int16)
a[:500, :500] = 2
am = np.ma.masked_equal(a, 0)
b = np.zeros((1000, 1000), dtype=np.int16)
b[250:750, 250:750] = 3
bm = np.ma.masked_equal(b, 0)
c = np.zeros((1000, 1000), dtype=np.int16)
c[500:1000, 500:1000] = 5
cm = np.ma.masked_equal(c, 0)
bm.mask = np.logical_or(np.logical_and(am.mask, bm.mask), np.logical_not(am.mask))
am = np.ma.array(am.filled(0) + bm.filled(0), mask=(am.mask * bm.mask))
cm.mask = np.logical_or(np.logical_and(am.mask, cm.mask), np.logical_not(am.mask))
am = np.ma.array(am.filled(0) + cm.filled(0), mask=(am.mask * cm.mask))
plt.imshow(am)
我希望有人发现这是很有帮助的某个时候。掩盖的数组似乎不是非常有效的。所以,如果有人发现一个合并数组的替代品,我很乐意知道。
更新:基于@morningsun评论此实现30%的速度更快,更简单:
import numpy as np
a = np.zeros((1000, 1000), dtype=np.int16)
a[:500, :500] = 2
am = np.ma.masked_equal(a, 0)
b = np.zeros((1000, 1000), dtype=np.int16)
b[250:750, 250:750] = 3
bm = np.ma.masked_equal(b, 0)
c = np.zeros((1000, 1000), dtype=np.int16)
c[500:1000, 500:1000] = 5
cm = np.ma.masked_equal(c, 0)
am[am.mask] = bm[am.mask]
am[am.mask] = cm[am.mask]
plt.imshow(am)
什么是毫无遮拦的速度? – hpaulj
在你的真实数据中,数组中的数字总是像这样的常量?你实际上是否需要乘以数字,还是仅仅是你真正关心的口罩? –
我打算用这个代表图像的数组。理想情况下,我想保留原始数组的值(我知道我的代码不会保留这些值,因为它们会在交集中相乘)... – MonkeyButter