gpt4 book ai didi

python - numpy.array 中没有 Fortran 顺序

转载 作者:太空狗 更新时间:2023-10-30 02:24:48 31 4
gpt4 key购买 nike

我在以下位置看不到 Fortran 命令:

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

这不会创建新数组,而是创建同一数组的新 View :

>>> b.base is a
True

如果您希望数据具有内存布局 1 2 3 4 并具有 [[1, 3], [2, 4]] 的 Fortran 顺序 View ,执行此操作的有效方法是存储现有的C 顺序数组,然后转置它,这将生成具有所需内容的 Fortran 顺序数组,并且不需要额外的副本。

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

关于python - numpy.array 中没有 Fortran 顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51600969/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com