如何基于含参数t的2D矩阵生成3D数组并批量计算矩阵2范数?
无循环实现多t值下矩阵属性计算
给定含参数t的二维矩阵:
M = np.array([[0.5+t, 1, 1], [0.5, 0.5, t], [0.5, 1-t, 0.5]])
要针对多个t值计算矩阵的2范数,完全可以利用numpy的广播机制和向量化操作替代循环,具体实现如下:
方法一:构造3D矩阵并批量计算
通过将t向量扩展为三维形状,与常数数组广播生成包含所有t对应矩阵的3D数组,再一次性计算所有矩阵的范数:
import numpy as np # 生成t的取值数组 t_vec = np.linspace(0, 1, num=100) # 将t扩展为(100,1,1)的三维数组,用于广播运算 t_3d = t_vec[:, np.newaxis, np.newaxis] # 构造3D矩阵,每个切片对应一个t值的M矩阵 M_3d = np.array([ [0.5 + t_3d, np.ones_like(t_3d), np.ones_like(t_3d)], [0.5 * np.ones_like(t_3d), 0.5 * np.ones_like(t_3d), t_3d], [0.5 * np.ones_like(t_3d), np.ones_like(t_3d) - t_3d, 0.5 * np.ones_like(t_3d)] ]) # 调整维度顺序为(样本数, 行, 列),方便后续范数计算 M_3d = M_3d.transpose(2, 0, 1) # 批量计算每个矩阵的2范数,axis=(1,2)指定对每个(3,3)的切片计算 norm = np.linalg.norm(M_3d, axis=(1,2))
方法二:直接赋值构造3D矩阵(更直观)
如果觉得广播构造的写法不够直观,可以直接给3D数组的对应位置赋值,同样利用numpy的广播特性:
import numpy as np t_vec = np.linspace(0, 1, num=100) # 初始化(100,3,3)的3D数组 M_3d = np.zeros((len(t_vec), 3, 3)) # 逐个位置赋值对应表达式 M_3d[:, 0, 0] = 0.5 + t_vec M_3d[:, 0, 1] = 1 M_3d[:, 0, 2] = 1 M_3d[:, 1, 0] = 0.5 M_3d[:, 1, 1] = 0.5 M_3d[:, 1, 2] = t_vec M_3d[:, 2, 0] = 0.5 M_3d[:, 2, 1] = 1 - t_vec M_3d[:, 2, 2] = 0.5 # 批量计算范数 norm = np.linalg.norm(M_3d, axis=(1,2))
优势说明
这种向量化操作完全避免了Python循环,利用numpy的底层C优化实现计算,当t的取值数量很大时,效率会远高于循环实现。
内容的提问来源于stack exchange,提问作者Tamames
相关产品推荐
相关产品推荐

