基本上,Numpy将数组存储为平坦向量。多个维度只是由Numpy迭代器使用的不同视图和步幅创建的幻觉。
要了解Numpy内部工作原理的详细但易于理解的解释,请参见优秀的《The Beatiful Code》书籍第19章。
至少Numpy array()
和reshape()
有一个参数用于C('C')、Fortran('F')或保留顺序('A')。
还请参阅问题如何强制numpy数组顺序为Fortran风格?
默认C索引(行主序)的示例:
>>> a = np.arange(12).reshape(3,4) # <- C order by default
>>> a
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> a[1]
array([4, 5, 6, 7])
>>> a.strides
(32, 8)
使用Fortran顺序(列主序)进行索引:
>>> a = np.arange(12).reshape(3,4, order='F')
>>> a
array([[ 0, 3, 6, 9],
[ 1, 4, 7, 10],
[ 2, 5, 8, 11]])
>>> a[1]
array([ 1, 4, 7, 10])
>>> a.strides
(8, 24)
另一种视角
此外,您可以始终使用数组的参数T来获取另一种视角:
>>> a = np.arange(12).reshape(3,4, order='C')
>>> a.T
array([[ 0, 4, 8],
[ 1, 5, 9],
[ 2, 6, 10],
[ 3, 7, 11]])
>>> a = np.arange(12).reshape(3,4, order='F')
>>> a.T
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])
您也可以手动设置步幅:
>>> a = np.arange(12).reshape(3,4, order='C')
>>> a
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> a.strides
(32, 8)
>>> a.strides = (8, 24)
>>> a
array([[ 0, 3, 6, 9],
[ 1, 4, 7, 10],
[ 2, 5, 8, 11]])
numpy
内部机制并从那个角度给予建议。 - NPE