如何将各种尺寸的数组的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文件[重复]的主要内容,如果未能解决你的问题,请参考以下文章