如何从复杂CSV文件构建ID关联的3x3应力张量矩阵及numpy旋转方法
应力张量矩阵生成与旋转实现方案
一、批量生成绑定ID的3x3应力张量矩阵
假设你导入的CSV对应的Pandas DataFrame变量名为df,待处理的目标ID列表变量名为target_ids,表头命名规则为应力分量_ID(如x_1001、xy_1001对应ID为1001的分量),实现代码如下:
import pandas as pd import numpy as np # 初始化存储字典:key为目标ID,value为形状(时间点数量, 3, 3)的张量数组 stress_tensor_dict = {} # 提取有效时间点数据:你的文件共502行,前2行若为表头/注释行则过滤,保留500行时间点数据 time_series_df = df.iloc[2:].reset_index(drop=True) n_time = len(time_series_df) for id in target_ids: # 匹配当前ID对应的6个应力分量列,若表头后缀格式不是`_ID`可修改此处拼接规则 comp_cols = [ f'x_{id}', f'y_{id}', f'z_{id}', f'xy_{id}', f'yz_{id}', f'zx_{id}' ] # 提取分量时间序列,形状为(n_time, 6) comp_arr = time_series_df[comp_cols].values # 批量生成3x3对称应力张量 tensor_arr = np.zeros((n_time, 3, 3)) # 赋值对称矩阵元素 tensor_arr[:, 0, 0] = comp_arr[:, 0] tensor_arr[:, 0, 1] = tensor_arr[:, 1, 0] = comp_arr[:, 3] tensor_arr[:, 0, 2] = tensor_arr[:, 2, 0] = comp_arr[:, 5] tensor_arr[:, 1, 1] = comp_arr[:, 1] tensor_arr[:, 1, 2] = tensor_arr[:, 2, 1] = comp_arr[:, 4] tensor_arr[:, 2, 2] = comp_arr[:, 2] # 绑定ID存入字典 stress_tensor_dict[id] = tensor_arr
生成后可直接通过stress_tensor_dict[目标ID][时间点索引]获取对应3x3张量,方便后续调用。
二、基于Numpy的3x3应力张量旋转实现
应力张量的旋转遵循公式:σ' = R · σ · R^T,其中R为3x3正交旋转矩阵,R^T为旋转矩阵的转置,实现代码支持单个张量和批量时间点张量两种输入格式:
def rotate_stress_tensor(stress_tensor, rot_matrix): """ 旋转对称应力张量 参数: stress_tensor:输入应力张量,支持两种格式 1. 单个3x3张量:形状(3, 3) 2. 批量时间点张量:形状(n_time, 3, 3),与上文生成的张量数组格式匹配 rot_matrix:3x3正交旋转矩阵 返回: 旋转后的应力张量,形状与输入一致 """ if stress_tensor.ndim == 3: # 广播机制实现批量矩阵运算,无需循环遍历时间点 return rot_matrix @ stress_tensor @ rot_matrix.T return rot_matrix @ stress_tensor @ rot_matrix.T
使用示例
对ID为1001的所有时间点张量,执行绕X轴旋转30度的操作:
# 生成绕X轴旋转30度的正交旋转矩阵 theta = np.deg2rad(30) rot_x = np.array([ [1, 0, 0], [0, np.cos(theta), -np.sin(theta)], [0, np.sin(theta), np.cos(theta)] ]) # 旋转张量 rotated_tensor = rotate_stress_tensor(stress_tensor_dict[1001], rot_x)
内容的提问来源于stack exchange,提问作者Asbjoern Lund
相关产品推荐
相关产品推荐

