如何无循环实现Numpy数组指定区间的批量赋值?
无循环实现逐列区间赋值是否可行?
我有两个整数类型的一维数组x_start、x_end,以及起始值y_start和终止值y_end,形式如下:
y_start = # 某个数值 y_end = # 某个数值 x_start = # 整数类型一维数组 x_end = # 整数类型一维数组
希望不使用循环,实现以下代码的功能:
for i, y in enumerate(range(y_start, y_end)): arr[x_start[i]:x_end[i], y] = c
示例参数
y_start = 2 y_end = 5 x_start = np.array([2, 1, 3]) x_end = np.array([4, 3, 6]) c = 1
输入数组:
arr = np.array([[0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]])
期望输出:
arr = np.array([[0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0], [0, 0, 1, 1, 0, 0, 0], [0, 0, 1, 0, 1, 0, 0], [0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 1, 0, 0]])
请问这是否可行?
可行,用NumPy可以通过多种无循环方式实现需求,以下是两种实用方案:
方法一:广播掩码赋值
利用广播机制生成布尔掩码,直接对目标区域赋值,适合大规模数组场景:
import numpy as np # 初始化参数与数组 y_start = 2 y_end = 5 x_start = np.array([2, 1, 3]) x_end = np.array([4, 3, 6]) c = 1 arr = np.zeros((6,7), dtype=int) # 生成目标列索引 y_cols = np.arange(y_start, y_end) # 生成所有行索引并广播匹配列数 rows = np.arange(arr.shape[0])[:, None] # 构造掩码:行索引落在对应列的x区间内 mask = (rows >= x_start) & (rows < x_end) # 批量赋值 arr[:, y_cols] = np.where(mask, c, arr[:, y_cols]) print(arr)
方法二:构造索引对赋值
通过生成所有需要赋值的位置索引对,直接批量赋值,逻辑更直观:
import numpy as np # 初始化参数与数组 y_start = 2 y_end = 5 x_start = np.array([2, 1, 3]) x_end = np.array([4, 3, 6]) c = 1 arr = np.zeros((6,7), dtype=int) y_cols = np.arange(y_start, y_end) # 生成每个列对应的行索引区间 row_ranges = [np.arange(s, e) for s, e in zip(x_start, x_end)] # 生成与行索引一一对应的列索引 col_indices = np.repeat(y_cols, [len(r) for r in row_ranges]) # 合并所有行索引 flat_rows = np.concatenate(row_ranges) # 批量赋值 arr[flat_rows, col_indices] = c print(arr)
两种方法都能完全替代原循环的功能,无需迭代操作。
内容的提问来源于stack exchange,提问作者Aayush
相关产品推荐
相关产品推荐

