如何在Pandas中处理C#导出的Vector3 CSV并完成向量计算?
在Pandas中处理C#导出的Vector3 CSV并完成向量运算
1. 导入CSV并解析Vector3字符串
先通过Pandas读取CSV文件,再将每个Vector3格式的字符串转换为NumPy数组,为后续向量运算做准备。
实现解析函数
编写一个轻量解析函数,去除字符串中的引号、括号,按逗号分割后转为浮点型数组:
import pandas as pd import numpy as np def parse_vector3(s): # 清理字符串格式,转换为NumPy数组 return np.fromstring(s.strip('"()'), sep=',', dtype=np.float64)
读取并转换CSV数据
读取CSV后,对所有以bBin开头的列应用解析函数:
# 读取第一个CSV文件 df1 = pd.read_csv('file1.csv') # 筛选所有Vector3类型的列 vec_cols = [col for col in df1.columns if col.startswith('bBin')] # 批量解析向量列 df1[vec_cols] = df1[vec_cols].applymap(parse_vector3) # 以相同方式读取并解析第二个CSV(需确保结构完全一致) df2 = pd.read_csv('file2.csv') df2[vec_cols] = df2[vec_cols].applymap(parse_vector3)
2. 计算对应位置向量距离并求和
需要计算两个DataFrame中相同aBin行、相同bBin列的向量欧氏距离,最终将所有距离累加为单个值。
基础循环实现(适合小数据量)
total_distance = 0.0 # 遍历每一行(按aBin对应) for idx in df1.index: # 遍历每个向量列 for col in vec_cols: vec1 = df1.loc[idx, col] vec2 = df2.loc[idx, col] # 计算欧氏距离并累加 distance = np.linalg.norm(vec1 - vec2) total_distance += distance print(f"所有对应向量的距离总和:{total_distance:.6f}")
向量化高效实现(适合大数据量)
利用NumPy广播特性批量计算,避免循环提升效率:
# 将向量列转换为3D数组:(行数, 列数, 3个坐标值) arr1 = np.stack(df1[vec_cols].values.tolist(), axis=1) arr2 = np.stack(df2[vec_cols].values.tolist(), axis=1) # 批量计算所有向量对的欧氏距离并求和 total_distance = np.linalg.norm(arr1 - arr2, axis=2).sum() print(f"所有对应向量的距离总和:{total_distance:.6f}")
注意事项
- 确保两个CSV的
aBin顺序完全一致,若不一致需先通过merge或设置aBin为索引对齐数据 - 解析函数可根据实际字符串格式调整,比如无引号时去掉
.strip('"')部分 - 欧氏距离也可手动计算:
np.sqrt(np.sum((vec1 - vec2)**2)),效果与np.linalg.norm一致
内容的提问来源于stack exchange,提问作者Ling
相关产品推荐
相关产品推荐

