python - numpy 数组中的 ndim 加载了 scipy.io.loadmat?

标签 python matlab numpy scipy mat-file

使用 SciPy 和 MATLAB,我无法重建数组以匹配使用 scipy.io.loadmat() 加载的 MATLAB 元胞数组给出的内容。

例如,假设我在 MATLAB 中创建一个包含一对 double 组的单元,然后使用 scipy.io 加载它(我使用 SPM 与 pynifti 等结合进行成像分析)

MATLAB

>> onsets{1} = [0 30 60 90]
>> onsets{2} = [15 45 75 105]

Python

>>> import scipy.io as scio
>>> mat = scio.loadmat('onsets.mat')
>>> mat['onsets'][0]
array([[[ 0 30 60 90]], [[ 15  45  75 105]]], dtype=object)

>>> mat['onsets'][0].shape

(2,)

我的问题是:为什么这个 numpy 数组的形状是 (2,) 而不是 (2,1,4)?在现实生活中,我尝试使用 Python 解析日志文件并构建这些起始元胞数组,因此我希望能够从头开始构建它们。

当我尝试从打印输出构建相同的数组时,我得到了不同的形状:

>>> new_onsets = array([[[ 0, 30, 60, 90]], [[ 15,  45,  75, 105]]], dtype=object)
array([[[0, 30, 60, 90]],

       [[15, 45, 75, 105]]], dtype=object)

>>> new_onsets.shape
(2,1,4)

不幸的是,形状(元胞数组中的 double 向量)是在上游规范中编码的,因此我需要能够以这种格式准确保存它。当然,这不是什么大问题,因为我可以在 MATLAB 中编写解析器,但如果能弄清楚发生了什么并增加我对 numpy 的[微薄]知识,那就太好了。

最佳答案

这是我个人觉得 python 中有点烦人的事情之一。这是因为 loadmat 自动“挤压”尺寸。

默认情况下,squeeze_me=True,因此您会看到:

>>> x = sio.loadmat('mymat.mat',squeeze_me=True)
>>> y = x['onsets']
>>> y.shape
(2,)

如果您使用 loadmat 且将 squeeze_me 设置为 False,则不会挤出一维:

>>> a = sio.loadmat('mymat.mat',squeeze_me=False)
>>> a
>>> b = a['onsets']
>>> b.shape
(1, 2)

也就是说,我一生都无法弄清楚如何让另一个维度显示(即 b.shape = (1,2,4))像“onsets”这样的元胞数组。我只能为非单元普通 MATLAB 数组获取它

onset_array = [onsets{1}; onsets{2}];

关于python - numpy 数组中的 ndim 加载了 scipy.io.loadmat?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10542263/

相关文章:

c# - 使用 Math.Net 的基于指数的曲线拟合

python - 任意重复 numpy 数组的内容

python - 使用 import_module 从不同目录导入模块

python - 第一次运行后循环停止 - Python

python - 如何为 python 文件设置自动 header

python - pandas 中 DataFrame.div 和 DataFrame.divide 的区别

python - Python 数组的切片

python - Apache日志文件数据分析与python pandas

matlab - 在matlab中用线连接子图

python - 在Python中生成随机稀疏正半定矩阵