4

我有两个 numpy 数组 - 基本上是 SimpleCV 图像的 numpy 表示。其中一个矩阵主要包含零条目,除了少数不是。我想将那些非零条目复制到另一个矩阵。我可以用简单的for循环轻松地做到这一点,但出于清晰和性能原因,我想用 numpy 做到这一点。阅读文档后,似乎屏蔽数组是要走的路,但我无法弄清楚如何告诉 numpy 只复制非屏蔽条目。一个虚拟的例子:

x = np.array([1,2,31,32,4,0,3,0,0,0])
y = np.ma.masked_where(x == 0, x)
z = np.array([99] * len(x))

z[:] = y

我希望y只更新 中的非屏蔽条目z,而是执行普通副本。我在这里是在正确的轨道上,还是应该去别处看看?

4

2 回答 2

3

您可以np.where为此使用 3 参数形式:

>>> import numpy as np
>>> x = np.array([1,2,31,32,4,0,3,0,0,0])
>>> z = np.array([99] * len(x))
>>> y = np.where(x != 0, x, z)
>>> y
array([ 1,  2, 31, 32,  4, 99,  3, 99, 99, 99])
于 2013-11-06T16:58:20.250 回答
2

你在正确的轨道上。而不是 using masked_where,您可以使用运算符 for找到x不为 0的值:!=ndarrays

>>> import numpy as np
>>> x = np.array([1,2,31,32,4,0,3,0,0,0])
>>> y = x != 0 # create a boolean array of indices i where x[i] != 0
>>> y
array([ True,  True,  True,  True,  True, False,  True, False, False, False], dtype=bool)
>>> z = np.array([99] * len(x))
>>> z
array([99, 99, 99, 99, 99, 99, 99, 99, 99, 99])
>>> z[y] = x[y]
>>> z
array([ 1,  2, 31, 32,  4, 99,  3, 99, 99, 99])
于 2013-11-06T16:57:38.883 回答