NumPy实现逐行点积与整数序列标量乘向量的方法
逐行对应点积实现
你原循环思路可行,但存在两处错误:
np.size(a)返回的是数组总元素个数,不是行数,应当用a.shape[0]获取行数量- 使用
c.append前需要先初始化c = []
实际使用时不推荐手写循环,NumPy的向量化运算效率远高于Python层循环,以下两种写法都可以直接得到你预期的[0, 2]结果:
import numpy as np a = np.array([[0,0,0],[0,0,1]]) b = np.array([[1,2,3],[1,3,2]]) # 写法1:可读性最高,逐元素相乘后按行求和 c1 = (a * b).sum(axis=1) # 写法2:einsum实现,大规模数组运算时性能更优 c2 = np.einsum('ij,ij->i', a, b)
注意:避免使用np.diag(a @ b.T)的写法,该方法会先计算所有行组合的点积,再提取对角线结果,存在大量冗余计算,数据量较大时性能很差。
整数序列与向量的标量乘法实现
这个操作可以直接通过NumPy的广播机制实现,只需要把一维整数序列转为列向量(形状为(序列长度, 1)),再和向量做乘法即可自动广播得到你要的二维结果:
a = np.array([1, 2]) b = np.array([0, 1, 0]) c = a.reshape(-1, 1) * b print(c) # 输出: # [[0 1 0] # [0 2 0]]
如果你不想用NumPy,纯Python列表场景下用列表推导即可实现:
a = [1, 2] b = [0, 1, 0] c = [[scalar * elem for elem in b] for scalar in a]
内容的提问来源于stack exchange,提问作者phantom551
相关产品推荐
相关产品推荐

