python ravel与在重塑中使用的转置

python ravel与在重塑中使用的转置,python,numpy,reshape,Python,Numpy,Reshape,我有一个二维数组v,v.shape=(M_1,M_2),我想用v.shape=(M_2,N_1,N_2)和M_1=N_1*N_2将其重塑为一个三维数组 我想到了以下几行,它们产生了相同的结果: np.reshape(v.T, reshape_tuple) 及 对于重塑元组=(M_2,N_1,N_2) 如果原始v是一个巨大的(可能是复数值的)矩阵,那么哪一个在计算上更好?在什么意义上(comp时间、内存等) 我的猜测是使用转置更好,但是如果restrape自动执行ravel,那么ravel选项可

我有一个二维数组
v
v.shape=(M_1,M_2)
,我想用
v.shape=(M_2,N_1,N_2)
M_1=N_1*N_2
将其重塑为一个三维数组

我想到了以下几行,它们产生了相同的结果:

np.reshape(v.T, reshape_tuple)

对于
重塑元组=(M_2,N_1,N_2)

如果原始
v
是一个巨大的(可能是复数值的)矩阵,那么哪一个在计算上更好?在什么意义上(comp时间、内存等)


我的猜测是使用转置更好,但是如果
restrape
自动执行
ravel
,那么ravel选项可能更快(尽管
restrape
可能在C或Fortran中执行
ravel
,但这并不清楚)

他们做事的顺序——重塑、改变步幅和复制——不同,但他们最终做的是同一件事

我喜欢使用
\uuuu数组\u接口\uuuu
查看数据缓冲区的位置以及其他更改。我想我应该添加
标志
来查看
顺序
。但是我们/你知道,
transpose
已经将顺序更改为
F
,对吗

In [549]: x=np.arange(6).reshape(2,3)
In [550]: x.__array_interface__
Out[550]: 
{'data': (187732024, False),
 'descr': [('', '<i4')],
 'shape': (2, 3),
 'strides': None,
 'typestr': '<i4',
 'version': 3}
T
中,我们仍然可以按数字顺序单步遍历数组。但是在重新整形之后,
1
0
并不接近。显然有一份拷贝

In [566]: x.T.reshape(2,3)
Out[566]: 
array([[0, 3, 1],
       [4, 2, 5]])
拉威尔之后的值顺序看起来很相似,重塑之后更明显

In [567]: x.ravel(order='F')
Out[567]: array([0, 3, 1, 4, 2, 5])
In [568]: x.ravel(order='F').reshape(2,3)
Out[568]: 
array([[0, 3, 1],
       [4, 2, 5]])

好吧,我明白了,看来我选择什么真的无关紧要。谢谢有趣的是,计时显示np.reformate(v.T,reformate\u tuple)比np.reformate(v.ravel(order='F'),reformate\u tuple)快得多。也许
reformate\u tuple
就是这样的
np.reformate(v.T,reformate\u tuple)
不需要复制。也就是说,新形状与转置形状兼容。我要检查
\uuuu数组\u接口\uuuu
In [552]: x.ravel(order='F').__array_interface__
Out[552]: 
{'data': (182286992, False),
 'descr': [('', '<i4')],
 'shape': (6,),
 'strides': None,
 'typestr': '<i4',
 'version': 3}
In [553]: x.T.ravel().__array_interface__
Out[553]: 
{'data': (182286992, False),
 'descr': [('', '<i4')],
 'shape': (6,),
 'strides': None,
 'typestr': '<i4',
 'version': 3}
In [554]: x.T.ravel().reshape(2,3).__array_interface__
Out[554]: 
{'data': (182286992, False),
 'descr': [('', '<i4')],
 'shape': (2, 3),
 'strides': None,
 'typestr': '<i4',
 'version': 3}
In [555]: x.ravel(order='F').reshape(2,3).__array_interface__
Out[555]: 
{'data': (182286992, False),
 'descr': [('', '<i4')],
 'shape': (2, 3),
 'strides': None,
 'typestr': '<i4',
 'version': 3}
In [558]: x.T.reshape(2,3).__array_interface__
Out[558]: 
{'data': (182286992, False),
 'descr': [('', '<i4')],
 'shape': (2, 3),
 'strides': None,
 'typestr': '<i4',
 'version': 3}
In [565]: x.T
Out[565]: 
array([[0, 3],
       [1, 4],
       [2, 5]])
In [566]: x.T.reshape(2,3)
Out[566]: 
array([[0, 3, 1],
       [4, 2, 5]])
In [567]: x.ravel(order='F')
Out[567]: array([0, 3, 1, 4, 2, 5])
In [568]: x.ravel(order='F').reshape(2,3)
Out[568]: 
array([[0, 3, 1],
       [4, 2, 5]])