2017-08-31 115 views
1

我想我在numpy的理解重塑功能直到我瞎搞与它跨越这个例子就是:numpy.reshape()与order ='F'是如何工作的?

a = np.arange(16).reshape((4,4)) 

返回:

array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11], 
     [12, 13, 14, 15]]) 

这对我来说很有意义,但是当我做的:

a.reshape((2,8), order = 'F') 

返回:

array([[0, 8, 1, 9, 2, 10, 3, 11], 
     [4, 12, 5, 13, 6, 14, 7, 15]]) 

我希望它返回:

array([[0, 4, 8, 12, 1, 5, 9, 13], 
     [2, 6, 10, 14, 3, 7, 11, 15]]) 

能有人请解释这里发生了什么?

+0

我的困惑是在fortran订单部分。 Fortran命令不会遵循我所说的我期望的阵列格式(如上所示)吗?我不明白为什么Fortran订单正在返回它。 – metalheadzone

回答

0

的的a为了 'F'

array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11], 
     [12, 13, 14, 15]]) 

是[0,4,8,12,1,5,9 ...](2元件

现在重新排列它们以,8)阵列。

我认为reshape文档谈论了散列元素,然后重塑它们。很明显,这个ravel是先完成的。

a.ravel(order='F').reshape(2,8)进行实验。

哎呀,我得到你所期望的:

In [208]: a = np.arange(16).reshape(4,4) 
In [209]: a 
Out[209]: 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11], 
     [12, 13, 14, 15]]) 
In [210]: a.ravel(order='F') 
Out[210]: array([ 0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15]) 
In [211]: _.reshape(2,8) 
Out[211]: 
array([[ 0, 4, 8, 12, 1, 5, 9, 13], 
     [ 2, 6, 10, 14, 3, 7, 11, 15]]) 

OK,我有重塑

In [214]: a.ravel(order='F').reshape(2,8, order='F') 
Out[214]: 
array([[ 0, 8, 1, 9, 2, 10, 3, 11], 
     [ 4, 12, 5, 13, 6, 14, 7, 15]]) 

In [215]: a.ravel(order='F').reshape(2,8).flags 
Out[215]: 
    C_CONTIGUOUS : True 
    F_CONTIGUOUS : False 
    ... 
In [216]: a.ravel(order='F').reshape(2,8, order='F').flags 
Out[216]: 
    C_CONTIGUOUS : False 
    F_CONTIGUOUS : True 

期间保持 'F' 为了从np.reshape文档

你可以考虑将整形作为第一次散列(使用给定的 索引顺序),然​​后从使用与用于 骚乱相同种类的索引排序将阵列划分为 新阵列。

order上的注意事项相当长,因此该主题令人困惑并不奇怪。