假设代码如下:
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
就像这个答案。