numpy广播规则的解决方法



我目前正在分析一项研究的一些数据。这项研究有27名参与者,每个参与者的数据都表示为一个三维数字数组。例如,参与者一的数据具有形状(22,59751(。我想把所有这27个数组组合成一个4维数组,其形状为(22,59751,27(。我所做的是初始化一个新的4D数组,其中填充了0。

comb_data = np.zeros((22, 59, 751, 27))

然后我循环遍历每个数组,然后将其分配到相应的位置。

for i, participant in enumerate(control_files):
comb_data[:, :, :, i] = np.load(os.path.join(path_control, participant))[:, :, :]

但是,有些数组具有不同的形状大小(由于数据收集中的问题(。因此,我现在面临的情况是:

ValueError: could not broadcast input array from shape (15,59,751) into shape (22,59,751)

我希望在可能的情况下分配数组,然后将剩余的填充/保持为0。有什么可能的方法来解决这种情况?。有没有办法让"较小"数组将0值自动填充到"较大"数组中?

您已经用零填充了空间,您只需要限制给定数组的大小。

for i, participant in enumerate(control_files):
a,b,c = participant.shape
comb_data[:a, :b, :c, i] = np.load(os.path.join(path_control, participant))[:, :, :]

不幸的是,numpy不会取形状为X的张量,并将其任意转换为形状为Y的张量,自动填充零。这主要是因为有成千上万种方法可以填充零,不必是系统的。

当然,首先你需要知道你最大的形状,然后初始化你的零矩阵,并根据每个元素的形状复制它的尺寸。

data_list = [np.load(os.path.join(path_control, p)) for p in control_files]
largest_shape = np.max(np.array([m.shape for m in data_list]), axis=0)
comb_data = np.zeros([len(data_list)]+largest_shape.tolist())
for i, m in enumerate(data_list):
comb_data[i, :m.shape[0], :m.shape[1], :m.shape[2]] = m

在这个例子中,我把每个人的索引放在第一位,但你也可以把它放在最后。

最新更新