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

Numpy:使用索引数组为三维数组赋值

Numpy高级索引实现多位置置1方案

问题描述

我有一个形状为(2, 2, 3)的indices数组,具体如下:

import numpy as np
indices = np.array([[[ 0,  6, 12],
        [ 0,  6, 12]],
       [[ 1,  7, 13],
        [ 1,  7, 13]]])

需要将这些值作为索引,把np.zeros生成的矩阵对应位置设为1。已创建形状为(2, 2, 18)的one_hot零数组:

one_hot = np.zeros((2, 2, 18))

期望得到的结果如下:

array([[[1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
        [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]],
       [[0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
        [0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]]])

希望用Numpy高级索引类似one_hot[indices] = 1的方式实现,该如何操作?

解决方案

要实现这个需求,关键是构造和indices维度匹配的前两个维度的索引数组,配合indices完成三维高级索引:

方法一:利用np.indices生成网格索引

# 生成前两个维度的索引数组,形状为(2,2)
i, j = np.indices(indices.shape[:2])

# 将i、j扩展为(2,2,1),和indices的(2,2,3)维度对齐,完成赋值
one_hot[i[..., np.newaxis], j[..., np.newaxis], indices] = 1

方法二:利用np.meshgrid生成网格索引

# 生成前两个维度的网格索引,indexing='ij'确保维度顺序和原数组一致
i, j = np.meshgrid(np.arange(2), np.arange(2), indexing='ij')

# 同样扩展维度后赋值
one_hot[i[..., np.newaxis], j[..., np.newaxis], indices] = 1

原理说明

one_hot是三维数组(2,2,18),定位元素需要三个索引:第一维索引、第二维索引、第三维索引(即indices中的值)。通过将前两个维度的索引扩展为和indices相同的三维结构,Numpy会自动广播这些索引,精准定位到每个需要置1的位置,完成赋值。

内容的提问来源于stack exchange,提问作者Max S.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 18:15:28