Python中NumPy数组切片冒号用法疑问及与Matlab差异咨询
问题解答
1. 正确获取目标元素的方法
你要提取的元素1、46、91、136在x0中的索引正好等于它们的数值(因为np.arange(0,180)生成的是0到179的连续整数)。你的切片[1:45:180]不符合预期,是因为NumPy切片遵循start:stop:step规则:从start开始,每次累加step,直到小于stop的位置停止。
你的代码里step=180,从1开始加180得到181,已经远大于stop=45,所以只取到了第一个元素1。正确的切片应该把step设为45(1到46差45,46到91差45,以此类推),stop设为180(确保包含最后一个目标元素136,因为数组最大索引是179,180超过这个值会自动停止):
import numpy as np x0 = np.arange(0, 180) y0 = x0[1:180:45] # 输出: array([ 1, 46, 91, 136])
2. 为什么使用0:91:90能得到[0,90]
同样是因为切片的stop是不包含的:
- 从0开始,第一次取索引0的元素(值0);
- 累加step=90得到90,90小于stop=91,所以取索引90的元素(值90);
- 再累加90得到180,180大于91,停止切片。
如果把stop设为90,那么90是不包含的,切片只会取到索引0的元素,所以必须把stop设为91才能包含索引90的元素。
3. Python(NumPy)与Matlab切片的核心差异及建议
核心差异
- 索引起始:Python/NumPy是0起始索引,Matlab是1起始;
- 切片范围:Python切片的
stop不包含对应索引,Matlab的end是包含对应位置的; - 步长位置:Python切片格式是
start:stop:step,Matlab是start:step:end(步长在中间); - 空值默认:Python中
x[:5]等价于x[0:5:1],x[5:]等价于x[5:len(x):1];Matlab中x(1:5)是取1到5的元素,x(5:end)是取5到末尾的元素。
实用建议
- 写切片前先明确目标元素的索引(尤其是0起始这点);
- 不确定
stop值时,可以直接留空(比如x0[1::45],等价于x0[1:len(x0):45]),避免计算错误; - 对比Matlab代码时,先把索引减1转换为0起始,再调整切片范围(比如Matlab的
x(1:45:180)要转成Python的x0[0:180:45])。
内容的提问来源于stack exchange,提问作者Erickzhou
相关产品推荐
相关产品推荐

