如何将 4D numpy 数组重塑为 3D 数组

Posted

技术标签:

【中文标题】如何将 4D numpy 数组重塑为 3D 数组【英文标题】:How to reshape a 4D numpy array to 3D array 【发布时间】:2021-08-06 02:26:01 【问题描述】:

我有一个 pandas 数组,其中包含一个列表列表,即 3 个嵌入列表 row 1 = [[[10,23,...,25],[10,23,...,25],[10,23,...,25]]] 最小的子列表包含 3 个列表,每个列表包含 601 个值。第一级子列表包含可变数量的列表 例如第 1 行的形状为 (22,601,3),第 2 行的形状为 (19,601,3) 等等。

当我将数组转换为 numpy 数据帧时,我得到了数组中行总长度的形状。 array = df.values or df.to_numpy() 该数组有 100 行 array.shape = (100,)

每个索引都有不同的长度 例如array[0].shape = (22,601,3) 行 = 22

我想展平/重塑数组,其中行数保持不变,但维度数会改变,使得形状变为 array.shape = (100,rows*601,3)

基本上就像将数组展平以使其适合尺寸并成为可以输入 RNN 模型的 3D 数组

【问题讨论】:

如果所有 100 个“行”的形状都为 (n,601,3),那么您应该能够将 concatenateaxis=0 生成一个 (sum(n), 601,3) 数组.我不确定reshape(100,-1,3) 是否可以正常工作。 【参考方案1】:

尝试一个小例子:

In [235]: alist = [np.ones((n,10,3),int) for n in [22,10,3,21]]
In [236]: arr = np.array(alist, object)
In [237]: arr.shape
Out[237]: (4,)
In [238]: arr[0].shape
Out[238]: (22, 10, 3)

这个arr 应该像你在df 中的数组。

如果其他维度都匹配(例如 (10,3)),则可以在第一个轴上简单连接子数组

In [239]: np.concatenate(arr, axis=0).shape
Out[239]: (56, 10, 3)
In [240]: sum([22,10,3,21])
Out[240]: 56

将其重塑为 (4,14,10,3) 有意义吗?这个和是 4 的倍数,但一般情况下并非如此。

或者,我们可以将子数组重塑为 2d,然后连接:

In [241]: arr1 = [i.reshape(-1,3) for i in arr]
In [242]: np.concatenate(arr1, axis=0).shape
Out[242]: (560, 3)
In [243]: np.concatenate(arr1, axis=0).reshape(4,-1,3).shape
Out[243]: (4, 140, 3)        # (4, 14*10, 3)

这可能是一样的。

【讨论】:

感谢@hpaulj 的回答我遇到的问题是,我不希望数组有无限数量的行,例如将 4 行转换为 56 行数组的示例.我正在尝试将数组馈送到需要 3D 输入的 RNN 中,并且我需要为每个输入创建一个类。 4 行到 4 个标签 但是,我希望输入大小能够针对每个输入进行更改,类似于 RNN 可以接收任意数量的单词并对文章进行分类。我希望模型将任意数量的列表/数组作为输入,并根据标签对其进行分类。 那么(100,rows*601,3) 是什么意思?什么是行?那是一个 3d 数组形状。 是的,它是一个 3D 阵列形状

以上是关于如何将 4D numpy 数组重塑为 3D 数组的主要内容,如果未能解决你的问题,请参考以下文章

Python将3d数组重塑为2d

如何将 numpy 数组重塑为 3 维以输入到卷积层?

重塑 3 列 numpy 数组

将 2D numpy 数组重塑为 3 个具有 x,y 索引的 1D 数组

Numpy 用 1 列将 1d 重塑为 2d 数组

将 numpy 数组转换为 4D nifti 文件