如何将 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),那么您应该能够将concatenate
与 axis=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 数组的主要内容,如果未能解决你的问题,请参考以下文章