[英]No fortran order in numpy.array
我看到没有强烈的命令:
import numpy as np
In [143]: np.array([[1,2],[3,4]],order='F')
Out[143]:
array([[1, 2],
[3, 4]])
但在下面它的工作原理:
In [139]: np.reshape(np.arange(9),newshape=(3,3),order='F')
Out[139]:
array([[0, 3, 6],
[1, 4, 7],
[2, 5, 8]])
那我在第一个做错了什么?
当您调用numpy.array
从现有Python对象创建数组时,它将为您提供一个具有原始Python对象所具有的任何形状的对象。 所以,
np.array([[1,2],[3,4]], ...)
永远都会给你,
np.array([[1, 2],
[3, 4]])
这正是你输入的内容,所以它不应该让人感到意外。 Fortran order和C order不描述数据的形状,它们描述了内存布局。 当您打印出一个对象时,NumPy不会向您显示内存布局,它只显示您的形状。
您可以看到,当您使用"K"
顺序将数组展平时,该数组确实以Fortran顺序存储,这保持了元素的原始顺序:
>>> a = np.array([[1,2],[3,4]], order="F")
>>> a.flatten(order="K")
array([1, 3, 2, 4])
这就是Fortran与C顺序的真正区别:内存布局。 大多数NumPy函数不会强制您考虑内存布局,而是透明地处理不同的布局。
听起来你想要的是转置,反转轴顺序。 这可以简单地完成:
>>> b = numpy.transpose(a)
>>> b
array([[1, 3],
[2, 4]])
这不会创建新数组,而是创建相同数组的新视图:
>>> b.base is a
True
如果您希望数据具有内存布局1 2 3 4并且具有[[1,3],[2,4]]的Fortran顺序视图,则执行此操作的有效方法是使用C存储现有数组顺序然后转置它,这导致具有所需内容的Fortran-order数组,并且不需要额外的副本。
>>> a = np.array([[1, 2], [3, 4]]).transpose()
>>> a.flatten(order="K")
array([1, 2, 3, 4])
>>> a
array([[1, 3],
[2, 4]])
如果您使用Fortran订单存储原始文件,则转置将导致C顺序,因此您不希望这样(或者您可能只关心转置,并且内存顺序不重要?)。 在任何一种情况下,数组在NumPy中看起来都是一样的。
>>> a = np.array([[1, 2], [3, 4]], order="F").transpose()
>>> a.flatten(order="K")
array([1, 3, 2, 4])
>>> a
array([[1, 3],
[2, 4]])
你构建二维数组的两种方法完全不相同。 在第一个中,您指定了数组的结构。 在第二个,你形成了一个数组,然后根据自己的喜好重新塑造。
>>> np.reshape([1,2,3,4],newshape=(2,2),order='F')
array([[1, 3],
[2, 4]])
同样,为了进行比较,即使您要求重新整形并将格式更改为FORTRAN,您也将获得指定的结构:
>>> np.reshape([[1,2],[3,4]],newshape=(2,2),order='F')
array([[1, 2],
[3, 4]])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.