我有一个由0和1填充的二进制N乘N(N~=200)NumPyarray.我想要应用布尔掩码并‘交换’掩码中对应于True的值,例如,如果我有:

arr = np.array([0,0,1,1],
               [0,0,1,1],
               [0,0,1,1],
               [0,0,1,1])
mask = np.array([True,False,True,False],
                [True,False,True,False],
                [True,False,True,False],
                [True,False,True,False],

我希望得到的数组是:

arr_new = np.array([1,0,0,1],
                   [1,0,0,1],
                   [1,0,0,1],
                   [1,0,0,1])

我首先创建了一个在值之间进行交换的函数swap_cell,然后按照this answer中的方法进行操作.

def swap_cell(x):
    if x == 1.0:
        return 0.0
    elif x == 0.0:
        return 1.0

arr_new = np.where(mask,swap_cell(arr),arr)

这段代码返回ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all(),我理解这是因为swap_cell()函数中的‘if’语句.我知道一定有更多的方法来实现这一点,但我认为这可能会奏效.

推荐答案

如果你将第一个(0,1)数组解释为布尔数组,那么你将对第一个数组中的每个条目和第二个数组中的每个条目进行exclusive or运算.

因此,您可以使用NumPy函数np.logic_xor()执行此操作,如下所示:

arr = np.array([[0,0,1,1],
                [0,0,1,1],
                [0,0,1,1],
                [0,0,1,1]])
mask = np.array([[True,False,True,False],
                 [True,False,True,False],
                 [True,False,True,False],
                 [True,False,True,False]])

np.array(np.logical_xor(arr, mask), dtype=int)

它会返回

array([[1, 0, 0, 1],
       [1, 0, 0, 1],
       [1, 0, 0, 1],
       [1, 0, 0, 1]])

Python相关问答推荐

Python tkinter关闭第一个窗口,同时打开第二个窗口

获取Azure Pipelines以从pyproject.toml(而不是relevments_dev.文本)安装测试环境

从Python调用GMP C函数时的分段错误和内存泄漏

从今天起的future 12个月内使用Python迭代

跟踪我已从数组中 Select 的样本的最有效方法

在Python中处理大量CSV文件中的数据

类型错误:输入类型不支持ufuncisnan-在执行Mann-Whitney U测试时[SOLVED]

Pandas - groupby字符串字段并按时间范围 Select

发生异常:TclMessage命令名称无效.!listbox"

按顺序合并2个词典列表

如何过滤包含2个指定子字符串的收件箱列名?

Python键入协议默认值

ODE集成中如何终止solve_ivp的无限运行

Pandas计数符合某些条件的特定列的数量

pandas在第1列的id,第2列的标题,第3列的值,第3列的值?

在Django admin中自动完成相关字段筛选

如何合并两个列表,并获得每个索引值最高的列表名称?

在两极中过滤

如何在PySide/Qt QColumbnView中删除列

使用Python从rotowire中抓取MLB每日阵容