如何对NumPy数组的slice对象取反以获取非切片区间元素?
解决numpy中slice取反的需求
直接对slice对象使用~运算符是行不通的,因为slice本身不支持按位取反操作。要实现你想要的效果——得到原slice索引范围之外的元素(即arr[0]和arr[10:]的拼接),可以用以下几种方式:
方法1:转换为布尔掩码取反
先创建一个全True的布尔数组,将原slice对应的位置设为False,再用这个掩码索引数组,即可得到补集元素:
import numpy as np arr = np.linspace(0, 10, 100) s = slice(1, 10) mask = np.ones(len(arr), dtype=bool) mask[s] = False print(arr[mask])
方法2:手动构造补集索引
通过解析slice的起始、结束、步长参数,直接生成补集对应的索引数组,再用该索引取元素:
import numpy as np def invert_slice(s, arr_length): # 解析slice的默认参数:start默认0,stop默认数组长度,step默认1 start = s.start if s.start is not None else 0 stop = s.stop if s.stop is not None else arr_length step = s.step if s.step is not None else 1 # 生成补集的索引:0到start的前一位,加上stop到数组末尾的所有元素 return np.r_[np.arange(start), np.arange(stop, arr_length, step)] arr = np.linspace(0, 10, 100) s = slice(1, 10) complement_indices = invert_slice(s, len(arr)) print(arr[complement_indices])
方法3:直接拼接补集切片
如果slice的步长是1(默认情况),可以直接拼接两部分切片结果,写法更简洁:
import numpy as np arr = np.linspace(0, 10, 100) s = slice(1, 10) complement = np.r_[arr[:s.start], arr[s.stop:]] print(complement)
以上三种方法都能实现你需要的arr[~s]等效效果,可根据实际场景选择最合适的方式。
内容的提问来源于stack exchange,提问作者Tom McLean
相关产品推荐
相关产品推荐

