如何将三维NumPy数组的每一行与列表逐元素相乘?
解决方案
首先,先把你给出的原始列表转为真正的NumPy数组(你写的array是Python嵌套列表,必须转成np.ndarray才能利用NumPy的高效运算机制):
import numpy as np # 转换为三维NumPy数组 arr = np.array([[[1,2,3,10], [4,5,6,11], [7,8,9,12]], [[1,2,3,10], [4,5,6,11], [7,8,9,12]]]) lst = np.array([50, 60, 70])
接下来利用NumPy的广播机制实现高效逐元素相乘:你的数组形状是(2, 3, 4),列表转成数组后形状是(3,),我们只需要把它调整为(3, 1)的形状,就能和数组的第二、第三维度自动匹配,完成广播相乘:
# 调整列表数组的形状,适配三维数组的广播规则 lst_reshaped = lst.reshape(-1, 1) # 直接执行逐元素乘法 result = arr * lst_reshaped
执行后result的结果完全符合你的预期:
array([[[ 50, 100, 150, 500], [240, 300, 360, 660], [490, 560, 630, 840]], [[ 50, 100, 150, 500], [240, 300, 360, 660], [490, 560, 630, 840]]])
补充说明
np.dot()是矩阵点积运算,不是逐元素乘法,它要求维度满足矩阵相乘的规则,所以会报错。你需要的逐元素乘法用*操作符即可,但要保证维度能通过广播匹配。- 列表推导式效率低是因为它本质是Python层面的循环,而NumPy的广播操作是底层C实现的,对于你提到的大数组(axis 0长度1088),速度会快几个数量级。
内容的提问来源于stack exchange,提问作者Archerlite
相关产品推荐
相关产品推荐

