如何高效向量化生成累积乘积三角矩阵?
问题描述
给定一维向量(例如 [a b c d]),需要构建如下下三角矩阵:
a 0 0 0 ab b 0 0 abc bc c 0 abcd bcd cd d
现有实现代码存在不必要的for循环,不够简洁:
import numpy as np v = np.array([1, 2, 3]) n = len(v) matrix = np.zeros((n,n)) for i in range(n): matrix [i,:i+1] = np.flip(np.cumprod(np.flip(v[:i+1]))) print(matrix) # [[1. 0. 0.] # [2. 2. 0.] # [6. 6. 3.]]
请问如何对该实现进行向量化优化?
向量化优化方案
可以利用累积乘积的数学性质实现完全向量化,无需循环:
import numpy as np v = np.array([1, 2, 3]) n = len(v) # 生成带前缀1的累积乘积数组 cum_v = np.concatenate([[1], np.cumprod(v)]) # 获取所有位置的行列索引矩阵 i, j = np.indices((n, n)) # 一次性完成矩阵赋值:下三角区域计算乘积,上三角区域置0 matrix = np.where(i >= j, cum_v[i+1] / cum_v[j], 0) print(matrix) # [[1. 0. 0.] # [2. 2. 0.] # [6. 6. 3.]]
原理说明
- 构造带前缀1的
cum_v数组后,任意子数组v[j:i+1]的乘积可以直接通过cum_v[i+1] / cum_v[j]计算,避免逐段重复计算乘积。 np.indices生成的索引矩阵能一次性覆盖所有矩阵位置,配合np.where可以批量完成条件判断与赋值,彻底消除循环。
内容的提问来源于stack exchange,提问作者edd313
相关产品推荐
相关产品推荐

