簡體   English   中英

索引 R 與 Python

[英]Indexing R vs Python

試圖理解數組索引 R 與 Python(准確地說是 numpy)

R版

a = array(0:7, c(2,2,2))

輸出看起來像這樣

, , 1

     [,1] [,2]
[1,]    0    2
[2,]    1    3
, , 2
     [,1] [,2]
[1,]    4    6
[2,]    5    7

如果我嘗試訪問第一個“元素” a[1,,]這就是我得到的:

     [,1] [,2]
[1,]    0    4
[2,]    2    6

蟒蛇版

a = np.array(range(8)).reshape((2,2,2))
array([[[0, 1],
        [2, 3]],

       [[4, 5],
        [6, 7]]])

a[0,::]給了我不同的輸出:

array([[0, 1],
       [2, 3]])

看起來索引以不同的方式工作。 我應該如何在 python 中索引以獲得與 R 版本相同的結果?

不同的結果來自於 R 和 Python 在內部存儲多維數組的兩種不同方式:

  • R 使用列優先順序(也稱為類 Fortran 順序)
  • Python 使用行優先順序(也稱為類 C 順序)。

(不幸的是,“C”不代表“列”,而是代表“C 語言”...)

來源: https : //en.wikipedia.org/wiki/Row-_and_column-major_order其中說:

列優先順序用於 Fortran、MATLAB、[7] GNU Octave、S-Plus、[8] R、[9] Julia、[10] 和 Scilab。[11]

...

行優先順序是 NumPy[18](對於 Python)中的默認值。

這會影響方式的多維數組從一個維數組默認構造的,當你與你的代碼做array()中的R函數和numpy.array()與一起在Python功能numpy.reshape()函數。

從 numpy 的reshape()文檔中:

重塑(a,新形狀,訂單='C')

...

order : {'C', 'F', 'A'}, optional 使用此索引順序讀取 a 的元素, a使用此索引順序將元素放入重構的數組中。 'C' 表示使用類似 C 的索引順序讀取/寫入元素,最后一個軸索引變化最快,回到第一個軸索引變化最慢。 'F' 表示使用類似 Fortran 的索引順序讀取/寫入元素,第一個索引變化最快,最后一個索引變化最慢。

解決方案

在兩種語言中從一維數組定義多維數組時,您應該使用相同的索引順序。

例如,您可以通過將選項order='F'傳遞給numpy.reshape()函數,使用列優先順序在 Python 中定義數組,如下所示:

a = np.array(range(8)).reshape((2,2,2), order='F')
array([[[0, 4],
        [2, 6]],
       [[1, 5],
        [3, 7]]])

現在a[0,::]給出:

array([[0, 4],
       [2, 6]])

即與 R 的a[1,,]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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