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

numpy fancy indexing按列提取子矩阵轴顺序异常问题求解

问题原因

你观察到的输出差异本质是numpy花式索引的维度广播规则导致的:

  • 当你在行维度传入形状为(2,2)的索引数组,列维度留空(默认全选)时,输出形状为索引数组形状 + 列长度 = (2,2) + 3 = (2,2,3),刚好符合你按行取子矩阵的预期。
  • 当你在列维度传入形状为(2,2)的索引数组,行维度用:全选时,输出形状为行长度 + 索引数组形状 = 3 + (2,2) = (3,2,2),这就是你拿到的非预期结果的形状。

最优实现方案

方案1:直接调整维度(最简洁,兼容所有numpy版本)

不需要提前转置原矩阵,只需要把现有结果的前两个维度交换即可:

import numpy as np
A = np.array([[1,2,3],[4,5,6],[7,8,9]])
col_idx = np.array([[0,1],[1,2]])
B = A[:, col_idx].transpose(1,0,2)

执行后B就是你需要的输出:

array([[[1, 2],
        [4, 5],
        [7, 8]],

       [[2, 3],
        [5, 6],
        [8, 9]]])

方案2:滑动窗口视图(性能最优,无额外内存开销,需要numpy≥1.20.0)

如果你的需求是固定取相邻的2列作为子矩阵,直接用滑动窗口工具更直观,也不会产生额外的数组拷贝:

B = np.lib.stride_tricks.sliding_window_view(A, window_shape=2, axis=1)

输出结果和方案1完全一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 02:00:03