【问题标题】:Read Matlab Data File into Python, Need to Export to CSV将 Matlab 数据文件读入 Python,需要导出为 CSV
【发布时间】:2014-09-05 21:07:10
【问题描述】:

我已使用以下命令将包含大量数组作为数据集的 Matlab 文件读入 Python,将 Matlab 字典存储在变量名称 mat 下:

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 文件,其中一列包含字典中的数组名称,然后另一列包含每个对应数组的第一个元素。有没有办法利用类似的命令来获取'mat'字典变量内的数组中的所有对应元素?

【问题讨论】:

  • 考虑使用 HDF5,例如见 h5py 和相应的 matlab 函数
  • 您建议如何将不同的变量保存到单个 CSV 文件中?
  • 我希望有一种方法可以将所有变量及其对应的值写入一种类型的数据矩阵,如果您愿意的话,我可以将其导入 IBM SPSS Modeler 以对数据进行一些分析.我希望避免遍历整个字典变量,直到所有变量都被读取,因为我是 Python 新手,并且知道这需要理解我觉得我在语言中没有的逻辑。将研究理解 HDF5 和任何其他建议将不胜感激。谢谢!
  • with open('mycsvfile.csv','wb') as f: w = csv.writer(f) w.writerows(mat.items()) 给了我一个带有数组的 csv 文件变量名和数组的第一个值,有没有人知道使用类似这样的命令从字典中对应的数组中获取所有值的方法?
  • 您能否编辑您的问题以包含该信息?

标签: python matlab numpy scipy


【解决方案1】:

函数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.items()}) # compatible for both python 2.x and python 3.x

data.to_csv("example.csv")

【讨论】:

  • 我得到这个错误'dict'对象没有属性'iteritems'。
  • 如果你使用 Python 3.x,它应该是 .items() 而不是 .iteritems()
【解决方案2】:

这是将任何 .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=',')

【讨论】:

    【解决方案3】:
    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
    
    

    【讨论】:

      【解决方案4】:

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

      给出一个值和键的字典

      和“'header', 'version', 'globals'”这些是我们需要删除的一些默认值

      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:”删除不需要的标题值,然后使用其余标题创建数据框,最后将列值分配给相应的列标题

      【讨论】:

        猜你喜欢
        • 2013-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-12
        • 1970-01-01
        • 2022-01-23
        • 1970-01-01
        相关资源
        最近更新 更多