numpy根据条件用numpy数组替换数组元素

xxb16uws  于 2023-04-21  发布在  其他
关注(0)|答案(2)|浏览(118)
subst1 = numpy.array([2, 2, 2, 2])
subst2 = numpy.array([3, 3, 3, 3])

a = numpy.array([[1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0,]])
b = numpy.where(0==a, subst1, subst2)

结果:

>>> a
array([[1, 0, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 0]])
>>> b
array([[3, 2, 2, 2],
       [2, 2, 2, 2],
       [2, 2, 2, 2]])

我想要的:

array([[[3,3,3,3], [2,2,2,2], [2,2,2,2], [2,2,2,2]],
       [[2,2,2,2], [2,2,2,2], [2,2,2,2], [2,2,2,2]],
       [[2,2,2,2], [2,2,2,2], [2,2,2,2], [2,2,2,2]]])

我知道这不起作用,因为subst*数组是按元素使用的。
这可能是不可能的,替代解决方案也是受欢迎的。
我 * 想 * 使用numpy数组作为替代,我知道类似的事情可以做,如果我用bytes替换subst*数组。我想要一个高效的解决方案,我这样做是为了与另一个解决方案进行性能比较-它有自己的问题。
我猜这将使一个三维阵列出一个二维,但我不确定。

h7wcgrx3

h7wcgrx31#

广播:

b = np.where(0==a[...,None], subst1, subst2)

输出:

array([[[3, 3, 3, 3],
        [2, 2, 2, 2],
        [2, 2, 2, 2],
        [2, 2, 2, 2]],

       [[2, 2, 2, 2],
        [2, 2, 2, 2],
        [2, 2, 2, 2],
        [2, 2, 2, 2]],

       [[2, 2, 2, 2],
        [2, 2, 2, 2],
        [2, 2, 2, 2],
        [2, 2, 2, 2]]])
drnojrws

drnojrws2#

您可以用途:

out = np.array([subst1, subst2])[a]

# or
out = np.vstack([subst1, subst2])[a]

输出:

array([[[3, 3, 3, 3],
        [2, 2, 2, 2],
        [2, 2, 2, 2],
        [2, 2, 2, 2]],

       [[2, 2, 2, 2],
        [2, 2, 2, 2],
        [2, 2, 2, 2],
        [2, 2, 2, 2]],

       [[2, 2, 2, 2],
        [2, 2, 2, 2],
        [2, 2, 2, 2],
        [2, 2, 2, 2]]])

相关问题