2017-08-31 116 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上的注意事項相當長,因此該主題令人困惑並不奇怪。