首页 > 解决方案 > Python Fancy Indexing Assignments:不能将 3 个输入值分配给掩码为 true 的 6 个输出值

问题描述

我正在尝试制作一个与源数组形状相同的归零数组。然后修改第二个数组中与第一个数组中的特定值相对应的每个值。

如果我只是替换一个值,这将很简单。这是一个玩具示例:

import numpy as np

arr1 = np.array([[1,2,3],[3,4,5],[1,2,3]])
arr2 = np.array([[0,0,0],[0,0,0],[0,0,0]])

arr2[arr1==1] = -1

这将按预期工作,并且 arr2 将是:

[[-1,0,0],
 [ 0,0,0],
 [-1,0,0]]

但我想替换一整行。像这样替换上面示例代码的最后一行:

arr2[arr1==[3,4,5]] = [-1,-1,-1]

当我这样做时,它也可以按预期工作,并且 arr2 将是:

[[ 0, 0, 0],
 [-1,-1,-1],
 [ 0, 0, 0]]

但是当我试图用类似的东西替换最后一行示例代码时:

arr2[arr1==[1,2,3]] = [-1,-1,-1]

我希望得到类似于最后一个输出的东西,但是第 0 行和第 2 行被更改了。但相反,我得到了以下错误。

ValueError: NumPy boolean array indexing assignment cannot assign 3 input values to the 6 
output values where the mask is true

我认为这是因为,与其他示例不同,它必须替换不止一行。虽然这对我来说似乎很奇怪,因为它可以很好地替换简单单值示例中的多个值。

我只是想知道是否有人可以向我解释这种行为,因为它有点令人困惑。我对 numpy 操作的内部工作没有那么丰富的经验。此外,如果有人有任何建议来做我想要以有效的方式完成的事情。

在我的实际实现中,我正在使用一个非常大的三维数组(具有 3 个颜色通道的图像),如果源图像具有特定的三个颜色通道,我想创建一个新数组,将特定值存储到这三个颜色通道中相应像素中的颜色值(如果它与我们的 pixel_rgb_of_interest 不匹配,则保持 [0,0,0])。我可以在线性时间内检查每一个像素,但如果有很多图像,这可能会有点慢,我只是想知道是否有更好的方法。

谢谢!

标签: pythonarraysnumpy

解决方案


这将是一个很好的应用程序numpy.where

>>> import numpy as np
>>> arr1 = np.array([[1,2,3],[3,4,5],[1,2,3]])
>>> arr2 = np.array([[0,0,0],[0,0,0],[0,0,0]])
>>> np.where(arr1 == [1,2,3], [-1,-1,-1], arr1)
array([[-1, -1, -1],
       [ 3,  4,  5],
       [-1, -1, -1]])

这基本上可以作为“只要条件为真,使用x参数,然后y在其余时间使用参数”


推荐阅读