将Matlab数据文件读入Python,需要导出为CSV

时间:2014-07-15 15:23:58

标签: python matlab numpy scipy

我已经阅读了一个包含大量数组作为数据集的Matlab文件到Python中,使用以下命令在变量名mat下存储Matlab Dictionary:

mat = loadmat('Sample Matlab Extract.mat')

有没有办法可以使用Python编写csv功能来保存这个我在Python中作为逗号分隔文件读取的Matlab字典变量?

with open('mycsvfile.csv','wb') as f:
   w = csv.writer(f)
   w.writerows(mat.items())
   f.close()

创建一个CSV文件,其中一列包含字典中的数组名称,然后另一列包含每个相应数组的第一个元素。有没有办法利用与此类似的命令来获取“垫子”内部阵列中的所有相应元素?字典变量?

4 个答案:

答案 0 :(得分:7)

函数scipy.io.loadmat生成一个如下所示的字典:

{'__globals__': [],
 '__header__': 'MATLAB 5.0 MAT-file, Platform: MACI, Created on: Wed Sep 24 16:11:51 2014',
 '__version__': '1.0',
 'a': array([[1, 2, 3]], dtype=uint8),
 'b': array([[4, 5, 6]], dtype=uint8)}

听起来你要做的就是制作.csv文件,其中包含键" a"," b"等作为列名及其对应的数组作为数据与每列相关联。如果是这样,我建议使用pandas制作格式良好的数据集,该数据集可以导出到.csv文件。首先,您需要清除字典中的注释成员(所有键以" __"开头)。然后,您希望将字典中的每个项目值转换为pandas.Series对象。然后可以将字典转换为pandas.DataFrame对象,该对象也可以保存为.csv文件。你的代码看起来像这样:

import scipy.io
import pandas as pd

mat = scipy.io.loadmat('matex.mat')
mat = {k:v for k, v in mat.items() if k[0] != '_'}
data = pd.DataFrame({k: pd.Series(v[0]) for k, v in mat.iteritems()})
data.to_csv("example.csv")

答案 1 :(得分:3)

这是将任何.mat文件转换为.csv文件的正确解决方案。试试吧

   import scipy.io
   import numpy as np
   data = scipy.io.loadmat("file.mat")

   for i in data:
        if '__' not in i and 'readme' not in i:
              np.savetxt(("file.csv"),data[i],delimiter=',')

答案 2 :(得分:0)

import scipy.io
import pandas as pd
import numpy as np
from datetime import datetime, timedelta

class MatDataToCSV():

    def init(self):

        pass

    def convert_mat_tocsv(self):

        mat = scipy.io.loadmat('wiki.mat')

        instances = mat['wiki'][0][0][0].shape[1]
        columns = ["dob", "photo_taken", "full_path", "gender",\
                "name", "face_location", "face_score", "second_face_score"]
        df = pd.DataFrame(index = range(0,instances), columns = columns)

        for i in mat:
            if i == "wiki":
                current_array = mat[i][0][0]
                for j in range(len(current_array)):
                    df[columns[j]] = pd.DataFrame(current_array[j][0])
        return df

答案 3 :(得分:0)

使用以下代码读取matfile(.MAT) 数据= scipy.io.loadmat(文件[0])

提供值和键的字典

和“'标头','版本','全局变量'”这些是我们需要删除的一些默认值

cols=[]
for i in data:
    if '__' not in i :
       cols.append(i)
temp_df=pd.DataFrame(columns=cols)
for i in data:
    if '__' not in i :
       temp_df[i]=(data[i]).ravel()

我们使用“ if'__'not in i:”删除不需要的标题值,然后使用其余标题创建数据框,最后将列值分配给相应的列标题