如何在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
相关产品推荐
相关产品推荐

