Python中不同数组间行的所有组合乘法实现问题
解决行组合元素级乘积的问题
首先我猜你用的是NumPy数组(毕竟提到了shape属性),下面分两种常用方式帮你实现需求:
方法一:NumPy广播(推荐,效率更高)
NumPy的广播机制可以不用循环就生成所有行对的乘积,结果是一个(5,5,20)的三维数组,其中all_row_products[i,j,:]正好对应A[i,:] * B[j,:]的元素级乘积:
import numpy as np # 示例数组,替换成你的真实数据 A = np.random.rand(5, 20) B = np.random.rand(5, 20) # 扩展维度实现广播:把A变成(5,1,20),B变成(1,5,20),相乘后自动匹配所有行对 all_row_products = A[:, np.newaxis, :] * B[np.newaxis, :, :] # 验证形状:输出(5,5,20) print(all_row_products.shape)
如果之后需要把三维数组转换成25个独立的行数组,可以用all_row_products.reshape(-1, 20),得到一个(25,20)的二维数组,每一行就是一组行对的乘积。
方法二:列表推导式(直观易懂)
如果你更习惯用循环方式,只要A和B是NumPy数组,原来的推导式其实可以工作——因为NumPy行向量((20,)形状)之间的*就是元素级乘法:
product_list = [x * y for x in A for y in B] # product_list包含25个(20,)的NumPy数组,顺序是A[0]*B[0], A[0]*B[1], ..., A[4]*B[4]
特殊情况:如果你用的是普通Python列表
如果A和B是普通嵌套列表(比如A = [[...]*20 for _ in range(5)]),直接x*y会变成列表重复,这时候需要用嵌套推导式做元素级相乘:
product_list = [[a * b for a, b in zip(x, y)] for x in A for y in B]
这样得到的就是25个长度为20的列表,每个都是对应行的元素乘积。
内容的提问来源于stack exchange,提问作者PedsB
相关产品推荐
相关产品推荐

