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

如何用NumPy实现三个一维数组生成对应元素乘积的三维数组?

实现三维数组的元素乘积矩阵(类似np.outer的三维版本)

当然有办法啦!在NumPy里,你可以通过几种简洁的方式实现这个需求,下面给你详细拆解:

方法1:利用NumPy广播机制(最直观)

广播是NumPy里非常强大的特性,我们只需要给每个一维数组增加合适的维度,让它们能自动扩展成三维形状,然后直接相乘就行:

import numpy as np

# 示例测试数组
A = np.array([1, 2])
B = np.array([3, 4, 5])
C = np.array([6, 7])

# 给每个数组扩展维度,形状分别变为 (m,1,1), (1,n,1), (1,1,k)
result = A[:, np.newaxis, np.newaxis] * B[np.newaxis, :, np.newaxis] * C[np.newaxis, np.newaxis, :]

print(result.shape)  # 输出 (2, 3, 2),对应m×n×k的维度
print(result[0,1,1]) # 输出 1*4*7=28,完全符合A[i]*B[j]*C[k]的要求

你也可以用np.expand_dims来更清晰地扩展维度,效果完全一致:

A_expanded = np.expand_dims(A, (1,2))
B_expanded = np.expand_dims(B, (0,2))
C_expanded = np.expand_dims(C, (0,1))
result = A_expanded * B_expanded * C_expanded

方法2:使用np.tensordot(张量点积)

tensordot可以处理多维的点积操作,通过指定轴参数就能实现三维外积:

# 分步实现:先算A和B的二维外积,再和C做张量扩展
temp = np.outer(A, B)
result = np.tensordot(temp, C, axes=0)

# 也可以一步到位
result = np.tensordot(np.tensordot(A, B, axes=0), C, axes=0)

这里axes=0表示不进行任何轴的收缩,直接做外积维度扩展。

方法3:使用np.einsum(爱因斯坦求和约定)

einsum是处理张量运算的神器,能通过索引符号清晰表达运算逻辑:

result = np.einsum('i,j,k->ijk', A, B, C)

这句代码的意思很直白:把A的i索引、B的j索引、C的k索引对应的元素相乘,输出一个带ijk索引的三维数组,完美匹配你的需求。

方法小对比

  • 广播法:最直观,代码易读,新手友好,性能表现也很出色。
  • tensordot:适合从二维外积场景扩展过来的使用习惯,需要一点张量基础概念。
  • einsum:代码最简洁,熟悉爱因斯坦求和后写起来效率极高,还能轻松扩展到四维及以上的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 11:47:33