NumPy数组能否倒切片?如何选取1-20、275-360两段元素?
NumPy数组多区间筛选的实现方案
你遇到的语法错误,本质是两个常见的认知偏差:
- Python原生切片仅支持
[start:stop:step]的三参数规则,无法在一对方括号内直接声明多段不连续的区间范围,四个数值用冒号分隔的写法本身就不符合语法规范,因此会直接抛出SyntaxError。 - 切片默认是按数组的索引位置取值,而非按元素本身的数值取值,你之前写的
1:10:275:360是把“想要筛选的元素值范围”和“切片的索引参数”混淆了。
你想要筛选「元素值120、275360」两段不连续内容的需求,针对NumPy数组有几种可直接运行的实现方式:
方法1:基于元素值的布尔掩码(推荐)
如果筛选条件是基于元素本身的数值范围,这种方法不需要手动计算索引,适配性最强,哪怕后续数组的步长、起始值发生变化,也不用改动逻辑:
import numpy as np longitude = np.arange(1, 361, 1) # 构造判断条件:元素在1~20 或者 275~360 mask = ((longitude >= 1) & (longitude <= 20)) | ((longitude >= 275) & (longitude <= 360)) test = longitude[mask]
注意:每个条件判断的小括号不能省略,否则会因为运算符优先级导致掩码计算错误。
方法2:拼接两段单区间切片
如果你确定当前数组是严格步长1、从1开始的连续序列,可以先算出两段元素对应的索引位置,再将两个单区间的切片结果拼接:
因为当前数组满足「元素值 = 索引 + 1」的对应关系:
- 元素值1~20 对应 索引0~19,切片为
longitude[0:20](Python切片的stop位置是开区间,写20即可刚好取到索引19的位置) - 元素值275~360 对应 索引274~359,切片为
longitude[274:360]
拼接可以选择两种写法:
- 用
np.concatenate拼接数组:test = np.concatenate([longitude[0:20], longitude[274:360]]) - 用NumPy内置的
r_简化拼接语法:test = np.r_[longitude[0:20], longitude[274:360]]
补充:关于反向切片的说明
你开头提到的数组反向切片,Python原生语法本身是支持的,只需要将step参数设置为-1即可:
- 对整个数组做完全倒序:
longitude[::-1] - 从指定位置反向取到数组开头:比如从元素值100的位置(对应索引99)往回取到数组起始位置,写法为
longitude[99::-1]
这类反向切片属于单区间切片的正常用法,和你这次遇到的多不连续区间筛选需求是完全独立的。
内容的提问来源于stack exchange,提问作者wabash
相关产品推荐
相关产品推荐

