具有不同最后轴维度元素的 Numpy 数组

Numpy array with elements of different last axis dimensions

假设以下代码:

import numpy as np

x = np.random.random([2, 4, 50])
y = np.random.random([2, 4, 60])

z = [x, y]
z = np.array(z, dtype=object)

这给出了 ValueError: could not broadcast input array from shape (2,4,50) into shape (2,4)

我能理解为什么会出现此错误,因为两个数组的尾随(最后)维度不同,并且 numpy 数组无法存储具有不同维度的数组。

但是,我碰巧有一个 MAT 文件,当通过 scipy 中的 io.loadmat() 函数加载到 Python 时,它包含一个具有以下属性的 np.ndarray :

from scipy import io

mat = io.loadmat(file_name='gt.mat')

print(mat.shape)
> (1, 250)

print(mat[0].shape, mat[0].dtype)
> (250,) dtype('O')

print(mat[0][0].shape, mat[0][0].dtype)
> (2, 4, 54), dtype('<f8')

print(mat[0][1].shape, mat[0][1].dtype)
> (2, 4, 60), dtype('<f8')

这让我很困惑。这个文件中的数组 mat[0] 如何将具有不同尾随维度的 numpy 数组作为对象,同时又是 np.ndarray 本身,而我自己却做不到?

在嵌套数组上调用 np.array 时,无论如何都会尝试堆叠数组。请注意,在这两种情况下,您都在处理对象。这仍然是可能的。一种方法是先创建一个空的对象数组,然后填充值。

z = np.empty(2, dtype=object)
z[0] = x
z[1] = y

Like in this answer.