web-dev-qa-db-ja.com

order = 'F'のnumpy.reshape()はどのように機能しますか?

Numpyの形状変更機能をいじって、この例に出くわすまで、私はそれを理解したと思いました。

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]])

誰かがここで何が起こっているのか説明できますか?

9
metalheadzone

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 docsは、要素を解きほぐし、次にそれらを再形成することについて話していると思います。明らかに、ラベリングが最初に行われます。

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、リシェイプ中は「F」の順序を維持する必要があります

_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
_

_np.reshape_ドキュメントから

再形成は、最初に(指定されたインデックス順序を使用して)配列をラベリングし、次にラベリングに使用されたのと同じ種類のインデックス順序を使用して、ラベリングされた配列から新しい配列に要素を挿入することと考えることができます。

orderに関するメモはかなり長いので、トピックが混乱しているのは当然のことです。

6
hpaulj