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

如何基于1D数组从两个3D NumPy数组选取元素生成新数组?

解决NumPy按层从两个3D数组中选取元素的问题

你的问题出在维度广播不匹配:c是1维数组(形状(3,)),而a、b是3维数组(形状(3,2,3))。直接使用np.where(c==0, a, b)时,NumPy会将c广播为(1,1,3)的形状,导致布尔判断作用在数组的最后一维,而非你期望的第一层(轴0),所以结果不符合预期。

下面是三种可行的解决方法:

方法1:扩展c的维度以匹配a、b

将c扩展为(3,1,1)的形状,让布尔判断作用在第一层(每个"层")上:

import numpy as np

a = np.array([[[1, 2, 3],
               [4, 5, 6]],

              [[7, 8, 9],
               [10, 11, 12]],

              [[13, 14, 15],
               [16, 17, 18]]])

b = a + 100
c = np.array([0, 1, 0])

# 扩展维度:[:, None, None] 等价于 np.expand_dims(c, (1,2))
result = np.where(c[:, None, None] == 0, a, b)
print(result)

输出结果完全符合预期:

array([[[  1,   2,   3],
        [  4,   5,   6]],

       [[107, 108, 109],
        [110, 111, 112]],

       [[ 13,  14,  15],
        [ 16,  17,  18]]])

方法2:直接按索引循环拼接

如果数组规模不大,直接通过循环按c的元素选择对应层,逻辑直观:

result = np.array([a[i] if c[i] == 0 else b[i] for i in range(len(c))])

方法3:堆叠数组后用高级索引选取

将a和b堆叠成一个4维数组,再用c作为索引直接提取对应层:

# 沿轴0堆叠a和b,得到形状(2,3,2,3)的数组
stacked = np.stack([a, b], axis=0)
# 用c选择第0轴的元素,np.arange(len(c))匹配第1轴的每个层
result = stacked[c, np.arange(len(c)), :, :]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 23:08:16