如何将各种尺寸的数组的Python列表保存到mat文件[重复]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将各种尺寸的数组的Python列表保存到mat文件[重复]相关的知识,希望对你有一定的参考价值。

我将数组的list保存到可以在Matlab中读取的文件中。列表中的数组是3维的,但形状各异,因此我无法将它们放入单个大数组中。

最初,我以为可以将列表保存到pickle文件中,然后在Matlab中读取文件。后来我发现Matlab不支持读取pickle文件。我也尝试使用scipy.io.savemat将列表保存到mat文件。数组尺寸的不一致会导致保存问题。

每个人都有解决问题的想法?应该注意的是,列表文件的内存非常大(> 4 G)。

答案

如果不需要单个文件,则可以遍历列表,并将每个条目savemat循环到单独的文件中。然后遍历该目录并将每个文件load循环到单元数组元素中。

您还可以压缩存储这些文件的目录,以使一个文件可以传递。

另一答案

savemat是用于以MATLAB格式保存numpy数组的正确工具。我建议在MATLAB中创建所需的结构,保存并loadmat。沿另一种方式复制该布局。

loadmat savemat文件以更好地了解如何将python对象映射到MATLAB对象。

数组可能会成为F阶2d数组。单元格可能成为对象dtype数组,结构可能成为结构化数组。

从列表中创建.mat`:

In [180]: io.savemat('test.mat', 'x':[np.arange(12).reshape(3,4), np.arange(3), 4])                                

重新加载:

In [181]: data = io.loadmat('test.mat')                                                                              
In [182]: data                                                                                                       
Out[182]: 
'__header__': b'MATLAB 5.0 MAT-file Platform: posix, Created on: Sat Mar 21 20:02:02 2020',
 '__version__': '1.0',
 '__globals__': [],
 'x': array([[array([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]]),
         array([[0, 1, 2]]), array([[4]])]], dtype=object)

具有一个命名变量

In [183]: data['x']                                                                                                  
Out[183]: 
array([[array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]]),
        array([[0, 1, 2]]), array([[4]])]], dtype=object)

形状是2d(类似于所有MATLAB),对象是dtype(用于容纳项的混合):

In [185]: data['x'].shape                                                                                            
Out[185]: (1, 3)

在二维数组内:

In [186]: data['x'][0,0].shape                                                                                       
Out[186]: (3, 4)

如果检查flags,我会看到data['x']是顺序F,F是连续的(但在savemat中使用的源是默认的C连续)。

还要注意1d数组和标量的形状变化-再次遵循MATLAB约定。

在八度音阶中:

>> data = load('test.mat')
data =

  scalar structure containing the fields:

    x =
    
      [1,1] =

         0   1   2   3
         4   5   6   7
         8   9  10  11

      [1,2] =

        0  1  2

      [1,3] = 4
    

我们得到一个cell变量。

如果我想要在此传输中没有更改的numpy矩阵,则必须从类似以下内容开始:

In [188]: np.arange(12).reshape(3,4,order='F')                                                                       
Out[188]: 
array([[ 0,  3,  6,  9],
       [ 1,  4,  7, 10],
       [ 2,  5,  8, 11]])

numpy在默认情况下为C顺序,以行为主,第一个维度是最外面的。 MATLAB相反-F(fortran),列主要,最后一个维度最外面。

以上是关于如何将各种尺寸的数组的Python列表保存到mat文件[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将 Numpy 结构数组保存到 *.mat 文件

如何在角度材料 2 中使用 mat-chip 和自动完成来保存选定的对象

如何在 Python 中保存二维数组(列表)?

Mat 类简析

MATLAB中如何建立一个Mat文件

我无法将cv :: Mat保存到1D数组中