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

为旋转索引分配索引:NumPy数组无循环旋转赋值失败排查

问题分析与解决方案

你的问题出在高级索引的维度匹配错误:当直接使用arr_rot[:, x_, y_] = arr[:, x_rot, y_rot]时,NumPy会将x_/y_与第一个维度(子数组维度)进行广播,导致所有子数组都复用了同一套索引规则,最终全部被180度旋转覆盖。

正确实现方式

这里提供两种高效的无显式循环解法:

方法1:利用np.rot90矢量化处理(直观易读)

直接对每个子数组调用np.rot90,用列表推导式实现(内部是NumPy优化的操作,性能优异):

import numpy as np

# 构造示例数组
arr = np.arange(12).reshape(3, 2, 2)
# 定义每个子数组的旋转次数(0°→k=0,90°→k=1,180°→k=2)
rotations = [0, 1, 2]

# 生成旋转后的数组
arr_rot = np.array([np.rot90(sub_arr, k=k) for sub_arr, k in zip(arr, rotations)])

# 验证结果
print("原数组:")
print(arr)
print("\n旋转后数组:")
print(arr_rot)

输出结果符合预期:

  • 第一个子数组保持不变,第二个逆时针转90°,第三个转180°。

方法2:修正高级索引的维度对应关系

如果你坚持用自定义索引数组,需要给每个子数组绑定独立的维度索引,确保索引一一对应:

import numpy as np

arr = np.arange(12).reshape(3, 2, 2)
arr_rot = np.zeros_like(arr)

# 生成基础索引
x, y = np.indices((2, 2))
# 定义每个子数组的旋转索引
x_rot = np.array([
    x,  # 0°旋转索引
    np.flipud(x).T,  # 90°逆时针旋转索引
    np.flipud(np.fliplr(x))  # 180°旋转索引
])
y_rot = np.array([
    y,
    np.flipud(y).T,
    np.flipud(np.fliplr(y))
])

# 用[:, None, None]绑定每个子数组的索引,避免广播错误
sub_idx = np.arange(3)[:, None, None]
arr_rot[sub_idx, x, y] = arr[sub_idx, x_rot, y_rot]

print(arr_rot)

这里的sub_idx = np.arange(3)[:, None, None]会将第一个维度的索引扩展为(3,1,1),与x/y的(2,2)维度匹配,确保每个子数组只使用自己对应的旋转索引。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 07:45:38