为何numpy的reshape操作打乱了我的数据模式?
NumPy数组重塑的维度顺序问题
先看创建数组的代码:
import numpy as np batch_size, seq_len = 3, 5 A = np.zeros((batch_size, seq_len)) A[0,0:] = 1 A[1,0:] = 2 A[2,0:] = 3
生成的数组A为:
array([[1., 1., 1., 1., 1.], [2., 2., 2., 2., 2.], [3., 3., 3., 3., 3.]])
直接执行A.reshape(seq_len, -1)后得到的结果和预期不符:
A4 = A.reshape(seq_len, -1) array([[1., 1., 1.], [1., 1., 2.], [2., 2., 2.], [2., 3., 3.], [3., 3., 3.]])
而预期结果是:
array([[1., 2., 3.], [1., 2., 3.], [1., 2., 3.], [1., 2., 3.], [1., 2., 3.]])
问题原因
NumPy的reshape方法是基于**行优先(C语言顺序)**的内存布局来重新排列元素的。原数组A在内存中是按1,1,1,1,1,2,2,2,2,2,3,3,3,3,3的顺序连续存储的,reshape(5, -1)只是把这15个元素按顺序分成5行,每行3个,自然得不到想要的维度交换效果。
解决方法
如果要实现维度交换后再调整形状的效果,应该先转置数组(交换维度),而不是直接用reshape:
A_expected = A.T # 或者用transpose显式指定维度顺序 A_expected = A.transpose(1, 0)
执行后得到的结果就是预期的数组:
array([[1., 2., 3.], [1., 2., 3.], [1., 2., 3.], [1., 2., 3.], [1., 2., 3.]])
核心要点:reshape仅用于在不改变元素内存顺序的前提下调整数组形状;如果需要交换维度,必须用转置类操作(T属性、transpose、swapaxes),再根据需要调整形状(若有必要)。
提示:新手注意,不要用reshape(或PyTorch中的view/reshape)来交换张量/数组的维度,这类方法不处理维度交换逻辑。
内容的提问来源于stack exchange,提问作者desert_ranger
相关产品推荐
相关产品推荐

