【问题标题】:Accesing a matrix within a .mat file with python使用 python 访问 .mat 文件中的矩阵
【发布时间】:2023-03-20 12:30:02
【问题描述】:

我正在将 matlab 代码翻译成 python。我在一个名为“AK_1”的 .mat 文件中有几个矩阵。我只想访问这些矩阵之一中的数据。 matlab 代码以这种方式访问​​它,其中 .response1 是所需的矩阵:

numtrials1 = subject_data1.response1(1,:);

我尝试将所有数据加载到一个字典中,这样我就可以使用这段代码将它循环到所需的矩阵,但这并没有产生可行的结果。

subject_data1_dict = {}

subject_data1 = scipy.io.loadmat('./MAT_Data_Full_AAAD_V2/AK_1.mat', subject_data1_dict)

如何仅访问文件 AK_1.mat 中的矩阵“response1”?

【问题讨论】:

  • 您是否阅读了scipy.io.loadmat 的文档?
  • 正如 jlarsch 回答的那样,“struct_as_record = False”是正确的,但它不会加载所有矩阵

标签: python matlab matrix


【解决方案1】:

假设您有一个myfile.mat,其结构如下:

S = 
    response1: [5x5 double]
    response2: [5x5 double]
    response3: [5x5 double]

你想从 python 访问response1。那么:

>>> from scipy.io import loadmat
>>> D = loadmat("myfile.mat", variable_names = ("S",) )
>>> D["S"]["response1"]   # returns matlab's S.response1

如果您想选择文件中包含的变量而不仅仅是 S,只需将它们添加到元组中,即 variable_names=("S","otherVar")

显然,如果您只对response1 数组感兴趣,您可以完全绕过收集字典,即:

>>> response1 = loadmat("myfile.mat", variable_names = ("S",) )["S"]["response1"]
>>> response1
array([[ array([[ 9,  1,  2,  2,  7],
       [10,  3, 10,  5,  1],
       [ 2,  6, 10, 10,  9],
       [10, 10,  5,  8, 10],
       [ 7, 10,  9, 10,  7]], dtype=uint8)]], dtype=object)

【讨论】:

  • 我认为他在 .mat 文件中没有三个独立变量,而是包含多个数组的单个 matlab 结构。因此点符号 (subject_data1.response1) ?
  • 啊,我明白了,好的。那讲得通;我误读了这个问题。我会更新我的答案。 :)
  • 这是正确的方法,非常简单的解决方案。谢谢!
【解决方案2】:

在 matlab 中创建并保存一个包含 3 个矩阵的结构:

a=1:5
b.aa=a
b.bb=a
b.cc=a
save(struct.mat,'b')

在python中加载.mat文件

from scipy.io import loadmat
matfile = loadmat('d:/struct.mat')

您现在可以通过以下方式访问例如 b.aa 和 b.bb:

matfile[('b')][0][0][0]
matfile[('b')][0][0][1]

这是你想要的吗?

【讨论】:

  • 这产生了与我的代码大致相同的结果,并非所有显示的矩阵包括我需要访问的矩阵
  • 您能否链接一个 .mat 文件,该文件的结构类似于导致问题的结构?
猜你喜欢
  • 1970-01-01
  • 2012-09-04
  • 2015-11-22
  • 2014-08-28
  • 2011-09-17
  • 2018-07-09
  • 2014-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多