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

如何在NumPy中使用高级索引复制/切片数组的特定部分?

解决NumPy中按行不同起止索引复制数组的问题

普通的NumPy切片操作无法支持每行使用不同的起止索引,因为切片参数必须是标量或统一的切片对象,不能直接传入数组。下面提供两种可行的解决方案:

方法一:利用布尔掩码实现

通过生成布尔掩码标记需要复制的位置,再进行赋值:

import numpy as np

a = np.arange(25).reshape(5,5)
min_idx = np.array([0, 1, 2, 1, 0])
max_idx = np.array([4, 3, 3, 2, 2])

# 生成形状为(5,5)的列索引数组
cols = np.arange(a.shape[1])[np.newaxis, :]
# 创建布尔掩码:列索引处于每行的[min_idx, max_idx]区间内
mask = (cols >= min_idx[:, np.newaxis]) & (cols <= max_idx[:, np.newaxis])

b = np.zeros_like(a)
b[mask] = a[mask]

print(b)

运行后即可得到目标数组target_b。

方法二:生成行/列索引对赋值

通过循环生成每行需要复制的列索引,再用高级索引完成赋值:

import numpy as np

a = np.arange(25).reshape(5,5)
min_idx = np.array([0, 1, 2, 1, 0])
max_idx = np.array([4, 3, 3, 2, 2])

row_indices = []
col_indices = []
for row in range(a.shape[0]):
    # 获取当前行需要复制的列索引范围
    current_cols = np.arange(min_idx[row], max_idx[row] + 1)
    row_indices.extend([row] * len(current_cols))
    col_indices.extend(current_cols)

b = np.zeros_like(a)
b[row_indices, col_indices] = a[row_indices, col_indices]

print(b)

两种方法都能实现需求:方法一利用NumPy的广播机制,代码更简洁高效;方法二逻辑直观,适合新手理解。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 10:35:04