How does numpy.reshape() with order = 'F' work?

一个人想着一个人 提交于 2019-12-30 03:17:10

问题


I thought I understood the reshape function in Numpy until I was messing around with it and came across this example:

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

which returns:

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

This makes sense to me, but then when I do:

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

it returns:

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

I would expect it to return:

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

Can someone please explain what is happening here?


回答1:


The elements of a in order 'F'

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

are [0,4,8,12,1,5,9 ...]

Now rearrange them in a (2,8) array.

I think the reshape docs talks about raveling the elements, and then reshaping them. Evidently the ravel is done first.

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

Oops, I get what you expected:

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, I have to keep the 'F' order during the reshape

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

From np.reshape docs

You can think of reshaping as first raveling the array (using the given index order), then inserting the elements from the raveled array into the new array using the same kind of index ordering as was used for the raveling.

The notes on order are fairly long, so it's not surprising that the topic is confusing.



来源:https://stackoverflow.com/questions/45973722/how-does-numpy-reshape-with-order-f-work

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!