如何在Numpy中沿动态对应轴执行原地运算?
解决方案
当然可以实现,不用多分支判断,核心利用NumPy的广播机制和动态维度处理就能完成,步骤如下:
- 定位目标轴:先找到数组shape中数值100对应的轴索引
- 构造匹配的缩放因子形状:通过扩展维度让缩放因子和原数组的广播规则匹配
- 原地执行缩放运算:直接用
*=完成原地操作
代码示例
import numpy as np def scale_array_inplace(arr, high, low): # 找到100所在的轴(假设shape中仅存在一个100) axis = np.where(np.array(arr.shape) == 100)[0][0] # 计算缩放值,若为长度100的数组也适用 scale_val = high - low # 构造广播所需的维度:在非目标轴上添加维度 expand_axes = [j for j in range(arr.ndim) if j != axis] scaler = np.expand_dims(scale_val, axis=expand_axes) # 原地缩放 arr *= scaler # 测试不同维度的情况 # 1维数组 arr_1d = np.random.rand(100) scale_array_inplace(arr_1d, 2, 0) # 2维数组(轴0为100) arr_2d_0 = np.random.rand(100, 200) scale_array_inplace(arr_2d_0, 2, 0) # 2维数组(轴1为100) arr_2d_1 = np.random.rand(200, 100) scale_array_inplace(arr_2d_1, 2, 0) # 3维数组(轴1为100) arr_3d = np.random.rand(300, 100, 200) scale_array_inplace(arr_3d, 2, 0)
关键逻辑说明
np.where(np.array(arr.shape) == 100)[0][0]:精准定位100所在的轴索引,无需分支判断维度数量np.expand_dims:动态在非目标轴添加维度,让缩放因子和原数组的维度结构匹配,确保广播时对应到目标轴的每个元素/切片*=:直接执行原地运算,符合题目要求的原地操作需求
内容的提问来源于stack exchange,提问作者Sterling Butters
相关产品推荐
相关产品推荐

