如何用二维操作实现NumPy数组对应3D转置后的展平顺序
问题描述
我有一个形状为(9,768)的NumPy数组,将其重塑为3D数组后展平,希望找到可实现相同展平顺序的二维操作组合(仅使用重塑、转置或展平,不生成3D及更高维张量)。示例如下:
>>> m = np.random.normal(size=(9,768)) >>> A = m.reshape((9,12,64)) >>> A = A.transpose((1,2,0)) >>> a = m.T.reshape((12, 576)) >>> np.array_equal(a.ravel(), A.ravel()) True
A的轴经过转置后,其等价二维操作为转置后再重塑。
请问,与以下操作等价的二维操作组合是什么?
>>> B = m.reshape((9,12,64)) >>> B = B.transpose((1,0,2))
要求仅能使用二维重塑、转置或展平操作,禁止生成3D或更高维张量。
等价二维操作方案
对应的二维操作组合是:先将原数组重塑为(108, 64),再转置,最后展平。验证代码如下:
>>> m = np.random.normal(size=(9,768)) >>> # 原3D操作流程 >>> B = m.reshape((9,12,64)) >>> B = B.transpose((1,0,2)) >>> b_flat = B.ravel() >>> # 等价二维操作流程 >>> b_equiv = m.reshape((108, 64)).T.ravel() >>> # 验证结果一致 >>> np.array_equal(b_flat, b_equiv) True
原理说明
- 原3D操作中,
m.reshape((9,12,64))是把每行768个元素拆分为12个长度为64的子块,形成(9,12,64)的三维结构。 - 转置
(1,0,2)交换了第0轴和第1轴,得到形状为(12,9,64)的数组。展平时的遍历顺序是:先遍历第0轴的12个分组,每个分组内遍历原第0轴的9个行,每个行对应64个元素。 - 对应到二维操作:将
(9,768)重塑为(9×12, 64) = (108,64),相当于把所有行的12个64元素块按顺序拼接成一列;转置后得到(64,108),其展平顺序和3D转置后的展平顺序完全匹配。
内容的提问来源于stack exchange,提问作者Effective_cellist
相关产品推荐
相关产品推荐

