求助:如何用布尔掩码反转二进制NumPy数组指定元素?
针对你的需求,有两种简洁的Pythonic实现方式,完全避免自定义标量函数带来的问题:
方法1:直接通过索引赋值(最直观高效)
先复制原数组,再对掩码为True的位置执行翻转操作(利用二进制特性:1 - x即可实现0和1互换):
import numpy as np 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 = arr.copy() arr_new[mask] = 1 - arr_new[mask]
运行后arr_new就是你期望的结果。
方法2:用np.where结合向量化运算
把原来的自定义函数替换成向量化的1 - arr,因为np.where支持直接传入数组作为参数,会自动逐元素处理:
arr_new = np.where(mask, 1 - arr, arr)
这个写法更紧凑,同样能得到正确结果。
为什么你的原代码报错?
你写的swap_cell函数是针对单个标量设计的,但调用时传入的是整个arr数组,导致x == 1.0返回一个布尔数组。而if语句无法直接判断数组的"真值"(numpy不知道你要判断数组中是否有任意元素为真,还是全部为真),所以抛出了ValueError。
内容的提问来源于stack exchange,提问作者gram_schmidt
相关产品推荐
相关产品推荐

