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

基于索引二维数组的原二维数组列变换向量化实现问询

向量化实现二维数组按多组列索引变换并拼接

刚好这个需求可以用numpy的高级索引特性完美解决,完全不需要写循环,一行代码就能搞定优雅的向量化实现。

首先先还原输入数据:

import numpy as np

np.random.seed(45)
a = np.random.randint(100, size=(5, 21))
b = np.array([
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
    [9, 8, 7, 6, 5, 4, 3, 2, 1, 0],
    [20, 19, 18, 17, 16, 15, 14, 13, 12, 11]
])

核心的向量化操作就这一行:

c = a[:, b].reshape(-1, b.shape[1])

原理解释:

  1. 高级索引取列:a[:, b]会生成一个三维数组,形状是(5, 3, 10)。这里的逻辑是:原数组a有5行,索引数组b有3组列索引(每行一组),每组10个列号。numpy会自动为每组索引从a中选取对应列,最终得到“5行 × 3组 × 10列”的三维结构。
  2. reshape拼接:用reshape(-1, 10)把三维数组展平成二维,-1让numpy自动计算行数(5行×3组=15行),刚好就是我们需要的纵向拼接后的结果。

你可以打印c验证,结果和你给出的预期输出完全一致:

print(c)

输出:

[[75 30  3 32 95 61 85 35 68 15]
 [24 12 17 68 30 56 14 36 31 86]
 [75 63 42 54 16 24 95 63 98 22]
 [59 92 55 88  5 81 93 79 67 55]
 [73 27 57 50  7 57 78 68 23 75]
 [15 68 35 85 61 95 32  3 30 75]
 [86 31 36 14 56 30 68 17 12 24]
 [22 98 63 95 24 16 54 42 63 75]
 [55 67 79 93 81  5 88 55 92 59]
 [75 23 68 78 57  7 50 57 27 73]
 [34 12 53  8 46 87 72 57 53 14]
 [77 49  8 11 42  6 17 79 61 57]
 [16 32 70 96 54 60 58 75 16 32]
 [ 9  9 20 55 87 18 78 27 83 57]
 [19 93 54 47 27 70 71  2 70 39]]

这种方法完全利用numpy的向量化运算,比循环实现效率高得多,尤其是处理大规模数组的时候优势非常明显。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:33:12