需要使用python将矩阵转换成三列的数据列表。
原始矩阵以Freq.[Hz]为横轴,以分贝数为纵轴,不同温度形成不同的曲线如下图所示:
希望转换成第一列频率(Freq。[Hz]),第二列温度,第三列分贝(dB)。
谢谢
你的数据文件有些小问题,大致处理的程序如下。
数据文件 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()))
根据您描述的问题,需要使用python将矩阵转换为具有三列的数据列,一列是Freq.[Hz] 一列是分贝数,一列是温度,从我对你的问题和需求的理解来看,最后的结构应该是每个Freq[Hz]会对应一列分贝数和一列温度,大概结构如下:
Fre.[Hz] 温度 分贝数
1501.160 -13.53 60
1501.160 -10.53 57
1501.160 -23.53 55
…
对于这样的数据的处理,建议使用python中的pandas进行处理,可以使用dataframe结构进行存储。
用Tolist()方法将数组或矩阵转换为列表,提供参考实例:https://www.zkxjob.com/47166
import pandas as pd
# data=pd.read_csv("你的数据")
# 我new 的数据
# 方法1 循环
data = pd.DataFrame({"Fr": [1123, 1124], "Tem": [60, 60], "57": [-13, -14], "56": [-12, -12]})
new_data=[]
for group_id, group_data in data.groupby(["Fr", "Tem"]):
db_values = group_data.values[:, 2:].reshape(-1)
db_name = group_data.columns.values[2:]
data_one=pd.DataFrame(
{"Fr": group_data["Fr"].values.tolist() * db_name.size, "Tem": group_data["Tem"].values.tolist() * db_name.size,
"db_name":db_name, "db_values": db_values})
new_data.append(data_one)
pd.concat(new_data).to_csv("new_data.csv",index=False)
#方法2 批量
db_name=data.columns.values[2:]
db_name=db_name.tolist()*data.shape[0]
db_values=data.values[:, 2:].reshape(-1)
data_one=pd.DataFrame(
{"Fr": data["Fr"].values.tolist()*db_name.size, "Tem": data["Tem"].values.tolist() * db_name.size,
"db_name":db_name, "db_values": db_values})
data_one.to_csv("new_data_one.csv",index=False)
你这个数据要是展开需要四个字段才能表达的清楚数据全部信息 写了两个方法 提供参考 一个是循环 合并 一个是批量处理
我写了个简单的例子
import numpy as np
# 定义原始矩阵
matrix = [[1,2,3,4,5],
[6,7,8,9,10],
[11,12,13,14,15]]
# 转换为三列的数据列表
data_list = np.reshape(matrix, (-1, 3))
首先,假设你有一个二维数组,存储了频率和分贝数的值,如下所示:
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
你可以使用 reshape() 函数将矩阵转换为三列的数据列表。
如下:
data_list = matrix.reshape(-1, 3)
这样会将原来的每一行看作一组数据,每一行的三个元素分别对应 Freq.[Hz],分贝数和温度
如果你需要对数据进行更细致的处理,可以使用 numpy 的其他函数,例如:
np.column_stack() 可以将多个一维数组按列堆叠在一起。
np.concatenate() 可以将多个数组沿指定轴连接在一起。
如果你需要存储数据到文件中,你可以使用 numpy 的 savetxt() 函数将数据保存到文本文件中,或者使用 np.save() 函数将数据保存到二进制文件中。
np.savetxt("data.txt", data_list, delimiter=",")
# or
np.save("data.npy", data_list)
示例:
import numpy as np
# 假设原始矩阵是 matrix
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 将矩阵转换为三列数据列表
data_list = matrix.reshape(-1, 3)
print(data_list)
# 输出: [[1 2 3]
# [4 5 6]
# [7 8 9]]
、、回答有用请你采纳、