簡體   English   中英

在numpy.array中沒有fortran命令

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM