You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 05:10:21