如何将二维NumPy数组与一维数组相乘得到三维数组?
更简便的实现方法:利用NumPy广播机制
嘿,其实你完全不用动用np.einsum,NumPy的广播机制就能完美解决这个需求,代码更简洁直观,而且效率也很高!
先回顾下你的输入:
import numpy as np A = np.array([[1, 2],[3, 4]]) B = np.array([10, 100])
方法1:用索引扩展维度 + 广播(最推荐)
只需要给A增加一个末尾的维度,然后直接和B相乘就行:
C = A[..., None] * B
验证结果:
print(C[:, :, 0]) # 输出: # [[10 20] # [30 40]] print(C[:, :, 1]) # 输出: # [[100 200] # [300 400]]
原理:A[..., None]把原本形状为(2,2)的A变成(2,2,1),而B的形状是(2,)。NumPy的广播机制会自动把B扩展为(1,1,2)的形状,让两个数组的维度完全匹配,然后逐元素相乘,最终得到你想要的(2,2,2)三维数组C。
方法2:用np.expand_dims显式扩展维度
和方法1本质一样,只是写法更明确:
C = np.expand_dims(A, axis=-1) * B
方法3:用np.multiply.outer
如果你喜欢用现成的函数,multiply.outer也能直接生成目标数组:
C = np.multiply.outer(A, B)
这个函数会直接计算A中每个元素和B中每个元素的乘积,生成的形状正好是(2,2,2),完全符合你的需求。
这些方法都比np.einsum更轻量易读,而且广播机制是NumPy的核心特性,日常处理这类维度扩展的需求非常好用~
内容的提问来源于stack exchange,提问作者math
相关产品推荐
相关产品推荐

