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

NumPy数组切片操作:按起止索引切片及生成固定长度子数组

NumPy数组切片相关问题解答

1. 如何获取NumPy数组中起止索引区间内的切片?

嘿,这可是NumPy入门必备的操作,我给你拆成一维和多维两种情况说清楚:

  • 一维数组:直接用 数组[起始索引:结束索引] 即可,注意NumPy的切片是左闭右开规则——包含起始索引对应的元素,但不包含结束索引的元素。举个实际例子:

    import numpy as np
    x = np.array([0, 1, 2, 3, 4, 5])
    # 取索引1到3的元素(包含1,不包含4)
    slice_result = x[1:4]
    print(slice_result)  # 输出: [1 2 3]
    

    还能省略起始或结束索引:x[:3] 表示从数组开头取到索引2的元素,x[2:] 表示从索引2取到数组末尾。

  • 多维数组:每个维度的切片用逗号分隔,格式为 数组[行切片, 列切片, ...]。比如处理二维数组:

    x_2d = np.array([[0,1,2],[3,4,5],[6,7,8]])
    # 取第1-2行(索引从0开始)、第1-2列的元素
    slice_2d = x_2d[1:3, 1:3]
    print(slice_2d)
    # 输出:
    # [[4 5]
    #  [7 8]]
    

2. 给定数组x、起始索引数组s以及长度d,如何创建数组y,满足y[i] == x[s[i]:s[i]+d]?

这个需求很常见,用NumPy的广播机制就能高效实现,完全不用写低效的循环:

假设x是一维数组,s是一维起始索引数组,d是固定的切片长度,直接构造所有需要的索引矩阵就行:

import numpy as np
x = np.array([0,1,2,3,4,5,6,7,8,9])
s = np.array([1, 3, 5])
d = 2

# 把s转换成列向量,和arange(d)广播成二维索引矩阵
indices = s[:, np.newaxis] + np.arange(d)
# 用索引矩阵直接提取x的元素
y = x[indices]

print(y)
# 输出:
# [[1 2]
#  [3 4]
#  [5 6]]

边界处理小提示

如果某个 s[i]+d 超出了x的长度,NumPy会直接报错。如果你想避免这种情况,可以用 np.clip 把索引限制在合法范围内:

max_valid_idx = len(x) - 1
indices = np.clip(s[:, np.newaxis] + np.arange(d), 0, max_valid_idx)
y = x[indices]
# 比如s里有8、d=2时,会取到[8,9]而不是报错

要是你希望超出部分用特定值填充(比如NaN),可以先给x做填充再索引:

# 把x填充到足够长度,超出部分用NaN填充
padded_x = np.pad(x, (0, d), mode='constant', constant_values=np.nan)
y = padded_x[indices]

内容的提问来源于stack exchange,提问作者michaelsnowden

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:53:24