Neil.Liu 2023-01-25 09:03 采纳率: 50%
浏览 82
已结题

使用#python#解决矩阵的转换问题。

需要使用python将矩阵转换成三列的数据列表。

原始矩阵以Freq.[Hz]为横轴,以分贝数为纵轴,不同温度形成不同的曲线如下图所示:

img

img

希望转换成第一列频率(Freq。[Hz]),第二列温度,第三列分贝(dB)。

数据原始文件

谢谢

  • 写回答

6条回答 默认 最新

  • youcans_ 人工智能领域优质创作者 2023-01-25 10:33
    关注

    你的数据文件有些小问题,大致处理的程序如下。
    数据文件 dataM 的形状是 (303104,3),第一列是 Freq,第二列是 Temp,第三列是 Noise

    import pandas as pd
    import numpy as np
    
    # 读取数据文件
    readPath = "../data/StripLA01SD1.txt"  # 数据文件的地址和文件名
    dfFile = pd.read_table(readPath, sep="|", header=0)  # 间隔符为空格,首行为标题行
    
    dfData = dfFile.loc[:, ~dfFile.columns.str.contains("Unnamed")]  # 删除 "Unnamed" 列
    print(dfData.head())  # 显示 dfData 前 5 行数据
    rows, cols = dfData.shape
    print("rows={}, cols={}".format(rows, cols))  # 8192, 38
    
    data = dfData.to_numpy()
    title = dfData.columns.values
    temp = []
    for i in range(1, cols):
        temp.append(eval(title[i]))
    lens = len(temp)
    # print("Temp", temp)
    print("len(Temp)", lens)
    
    datM = np.zeros((rows * lens, 3))  # rows=8192, lens=37
    print("datM", datM.shape)  # 8192*37=303104
    for l in range(lens):
        for row in range(rows):
            datM[l * (rows) + row, 0] = data[row, 0]  # Freq
            datM[l * (rows) + row, 1] = temp[l]
            datM[l * (rows) + row, 2] = data[row, l+1]
    print(datM[:10, :])
    print("Freq: min={:.1f}, max={:.1f}".format(datM[:, 0].min(), datM[:, 0].max()))
    print("Temp: min={:.1f}, max={:.1f}".format(datM[:, 1].min(), datM[:, 1].max()))
    print("Noise: min={:.1f}, max={:.1f}".format(datM[:, 2].min(), datM[:, 2].max()))
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 2月6日
  • 已采纳回答 1月29日
  • 创建了问题 1月25日