从R数组到Numpy数组

8
假设我有一个以下的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

现在我想在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]]])

但不知怎么回事,这两个看起来不一样。怎么在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]]])

这也不完全相同。
3个回答

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

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

如果你进行索引,你会发现它的执行效果完全一样:

R:

a[1,1,]
[1]  1 10

Python:
a[0,0,]
>>> array([ 1, 10])

与之前排名第一的答案相比,它将不会给你相同的价值。它可能在视觉上看起来相同,但功能并不相同。
b = np.arange(1, 19).reshape((2, 3, 3)).transpose(0,2,1)
b[0,0,]
>>> array([1, 4, 7])

此外,还可以看看reticulate团队关于差异的精彩小品:https://cran.r-project.org/web/packages/reticulate/vignettes/arrays.html

1
确实如此,只是看起来不一样,因为Python不像R那样提供结构化输出。 - undefined
这就是让我困惑的地方,我也尝试了同样的方法,因为打印出来的版本看起来不一样,所以我以为它生成了其他东西。 - undefined

2
在NumPy中,项目的顺序必须与列主序相匹配,以便复制与R中相同的数组。
可以通过先进行重塑,然后转置轴来实现这一点。
以下是我处理的方法:
import numpy as np

# Create the array in NumPy with the desired shape and order
a = np.arange(1, 19).reshape((3, 3, 2), order='F')

print(a)

这将为您提供一个与R数组顺序相匹配的NumPy数组。
array([[[ 1, 10],
        [ 2, 11],
        [ 3, 12]],

       [[ 4, 13],
        [ 5, 14],
        [ 6, 15]],

       [[ 7, 16],
        [ 8, 17],
        [ 9, 18]]])

2
除了np.arrange之外,您还可以使用更灵活的np.linspace,即。
np.linspace(1, 18, 18).reshape((3, 3, 2), order='F')

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

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

       [[ 3., 12.],
        [ 6., 15.],
        [ 9., 18.]]])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接