加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

在重塑时使用python ravel与transpose

发布时间:2020-12-16 22:48:13 所属栏目:Python 来源:网络整理
导读:我有一个2D数组v,v.shape =(M_1,M_2),我想重塑成一个3D数组,其中v.shape =(M_2,N_1,N_2),M_1 = N_1 * N_2. 我想出了以下几行产生相同的结果: np.reshape(v.T,reshape_tuple) 和 np.reshape(v.ravel(order='F'),reshape_tuple) for reshape_tuple =(M_2,N_2)

我有一个2D数组v,v.shape =(M_1,M_2),我想重塑成一个3D数组,其中v.shape =(M_2,N_1,N_2),M_1 = N_1 * N_2.

我想出了以下几行产生相同的结果:

np.reshape(v.T,reshape_tuple)

np.reshape(v.ravel(order='F'),reshape_tuple)

for reshape_tuple =(M_2,N_2).

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

我的猜测是使用转置效果更好,但如果重塑使用自动混乱,那么ravel-option可能更快(虽然重塑可能是在C或Fortran中进行混乱然后它不清楚)?

最佳答案
他们做事的顺序 – 重塑,改变步伐,制作副本 – 有所不同,但他们最终做同样的事情.

我喜欢使用__array_interface__来查看数据缓冲区的位置以及其他更改.我想我应该添加标志来查看订单.但是我们/你知道转置已经将顺序更改为F,对吧?

In [549]: x=np.arange(6).reshape(2,3)
In [550]: x.__array_interface__
Out[550]: 
{'data': (187732024,False),'descr': [('','

转置是一种视图,具有不同的形状,步幅和顺序:

In [551]: x.T.__array_interface__
Out[551]: 
{'data': (187732024,'shape': (3,2),'strides': (4,12),'version': 3}

不同顺序的ravel是一个副本(不同的数据缓冲区指针)

In [552]: x.ravel(order='F').__array_interface__
Out[552]: 
{'data': (182286992,'shape': (6,),'version': 3}

转置ravel也是一个副本.我认为相同的数据指针只是一个内存重用的情况(因为我没有分配给变量) – 但可以检查.

In [553]: x.T.ravel().__array_interface__
Out[553]: 
{'data': (182286992,'version': 3}

添加重塑:

In [554]: x.T.ravel().reshape(2,3).__array_interface__
Out[554]: 
{'data': (182286992,'version': 3}
In [555]: x.ravel(order='F').reshape(2,3).__array_interface__
Out[555]: 
{'data': (182286992,'version': 3}

我认为重塑中存在隐含的“拉威尔”:

In [558]: x.T.reshape(2,3).__array_interface__
Out[558]: 
{'data': (182286992,'version': 3}

(我应该重新设计这些示例以消除内存重用歧义.)无论如何,转置后重新整形需要与订单更改的ravel相同的内存副本.据我所知,两种情况都只需要一份副本.其他操作只涉及对形状等属性的更改.

如果我们只看阵列,可能会更清楚

In [565]: x.T
Out[565]: 
array([[0,3],[1,4],[2,5]])

在T中,我们仍然可以按数字顺序遍历数组.但重塑后,1并不接近0.显然有一个副本.

In [566]: x.T.reshape(2,3)
Out[566]: 
array([[0,3,1],[4,2,5]])

在ravel看起来相似之后的值的顺序,并且在重塑之后更明显地如此.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读