【问题标题】:Overlay part of the matrix on top of another将矩阵的一部分覆盖在另一个之上
【发布时间】:2013-11-06 16:53:16
【问题描述】:

我有两个 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 中的非屏蔽条目,而是执行普通副本。我是在正确的轨道上,还是应该去别处看看?

【问题讨论】:

  • 不要像那样创建z...如果您想要一个单行,请使用z = np.zeros_like(x) + 99,如果您不介意两个z = np.empty_like(a); z.fill(99)。在新的 numpy 1.8 中,您还可以使用 z = np.full_like(a, 99)
  • @Jaime 或者根本不要创建z,因为任何解决方案都可以简单地使用z = 99 进行广播。

标签: python image numpy


【解决方案1】:

您可以为此使用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])

【讨论】:

  • 我知道你刚刚从 OP 复制了它,但 z = ... 行是不必要的,因为 where 将广播:y = np.where(x!=0, x, 99)
【解决方案2】:

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

>>> 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])

【讨论】:

    猜你喜欢
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 2011-12-14
    • 2020-10-20
    相关资源
    最近更新 更多