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