You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 16:47:07