从 R 数组到 Numpy 数组

Avt*_*ili 8 python numpy r

可以说,我有一个以下 R 数组

a <- array(1:18, dim = c(3, 3, 2))

r$> a
, , 1

     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

, , 2

     [,1] [,2] [,3]
[1,]   10   13   16
[2,]   11   14   17
[3,]   12   15   18
Run Code Online (Sandbox Code Playgroud)

现在我想在 Python numpy 中拥有相同的数组。我用

a = np.arange(1, 19).reshape((3, 3, 2))

array([[[ 1,  2],
        [ 3,  4],
        [ 5,  6]],

       [[ 7,  8],
        [ 9, 10],
        [11, 12]],

       [[13, 14],
        [15, 16],
        [17, 18]]])
Run Code Online (Sandbox Code Playgroud)

但不知何故,这两个人看起来并不相同。如何在 Python 中复制同一个数组?

我也尝试过

a = np.arange(1, 19).reshape((2, 3, 3))

array([[[ 1,  2,  3],
        [ 4,  5,  6],
        [ 7,  8,  9]],

       [[10, 11, 12],
        [13, 14, 15],
        [16, 17, 18]]])
Run Code Online (Sandbox Code Playgroud)

这也不相同。

Jon*_*asV 6

基本上区别在于数组的顺序。

数组可以是行优先或列优先。请参阅此处了解一些信息。

R 默认构建列优先数组,Python 构建行优先数组。这就是为什么您使用的默认构造函数不会给出相同的输出。要解决这个问题,您可以告诉 Python 以列优先构造数组,方法是指定 Fortran 连续(列优先):

np.reshape(np.arange(1,19), (3,3,2), "F")

array([[[ 1, 10],
        [ 4, 13],
        [ 7, 16]],

       [[ 2, 11],
        [ 5, 14],
        [ 8, 17]],

       [[ 3, 12],
        [ 6, 15],
        [ 9, 18]]])
Run Code Online (Sandbox Code Playgroud)

它看起来不同,但底层数据与 R 中的相同。

如果您进行索引,您会发现它的执行完全相同:

回复:

a[1,1,]
[1]  1 10
Run Code Online (Sandbox Code Playgroud)

Python:

a[1,1,]
[1]  1 10
Run Code Online (Sandbox Code Playgroud)

将其与以前评价最高的答案进行比较,后者不会给您相同的值。它可能在视觉上看起来相同,但功能并不相同。

a[0,0,]
>>> array([ 1, 10])
Run Code Online (Sandbox Code Playgroud)

另请参阅网状团队关于差异的精彩小插图:https://cran.r-project.org/web/packages/reticulate/vignettes/arrays.html