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

如何将不同尺寸的二维NumPy数组相减得到三维数组?

问题描述

我有两个二维NumPy数组:数组M形状为2000×3,数组N形状为20×3,均为x、y、z坐标集合。尝试计算M减去N以得到一个2000×20×3的三维数组时,出现报错:

ValueError: operands could not be broadcast together with shapes (2000,3) (20,3)

简化示例代码

import numpy as np
M = np.array([[1,1,1],[2,1,1],[3,1,1],[4,1,1],[1,2,1],[2,2,1],[3,2,1],[4,2,1]])
N = np.array([[0,0,0],[1,0,0]])

print(M.shape)  # 输出 (8, 3)
print(N.shape)  # 输出 (2, 3)

期望输出

得到形状为(8,2,3)的数组A,即M中的每个坐标分别与N中的所有坐标计算差值,示例形式如下:

A = np.array([[[1,1,1],[0,1,1]],
              [[2,1,1],[1,1,1]],
              [[3,1,1],[2,1,1]],
              [[4,1,1],[3,1,1]],
              [[1,2,1],[0,2,1]],
              [[2,2,1],[1,2,1]],
              [[3,2,1],[2,2,1]],
              [[4,2,1],[3,2,1]]])

请问能否实现该需求?如何操作?优先避免使用for循环。


解决方案

可以实现,核心是利用NumPy的广播机制,通过扩展数组维度使二者满足广播条件,以下是几种高效实现方式:

方法1:手动扩展维度(最直观)

给M增加一个中间维度(变为(8,1,3)),给N增加一个前置维度(变为(1,2,3)),广播后自动匹配为(8,2,3)的结果:

A = M[:, np.newaxis, :] - N[np.newaxis, :, :]

也可以用reshape实现相同效果:

A = M.reshape(-1, 1, 3) - N.reshape(1, -1, 3)

方法2:使用np.expand_dims显式扩展

和方法1原理一致,用expand_dims更清晰地标注维度扩展位置:

A = np.expand_dims(M, axis=1) - np.expand_dims(N, axis=0)

方法3:利用np.subtract.outer

通过outer减法自动处理元素间的配对,最后调整形状到目标格式:

A = np.subtract.outer(M, N).transpose(0, 2, 1)

解释:np.subtract.outer(M, N)会生成(8,3,2,3)的中间数组,转置后将维度调整为(8,2,3)。

验证结果

运行上述任意方法后,A.shape会返回(8,2,3),且每个元素的差值计算完全符合预期。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 14:50:44