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

如何无循环实现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 21:10:46