从R数组到Numpy数组

5lwkijsr  于 8个月前  发布在  其他
关注(0)|答案(3)|浏览(49)

比如说,我有一个下面的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]]])

这也是不相同的。

m3eecexj

m3eecexj1#

基本上区别在于数组的顺序。
数组可以是行优先或列优先。here的一些信息。
R默认构造列优先数组,Python构造行优先数组。这就是为什么您使用的默认构造函数不会给出给予相同的输出。为了解决这个问题,你可以告诉Python在column-major中构造数组,说它应该在Fortran中连续(column-major):

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

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

bogh5gae

bogh5gae2#

NumPy中元素的顺序必须与column-major的顺序匹配,才能重现与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)

这将给予一个NumPy中的数组,该数组与R数组的顺序相匹配:

array([[[ 1, 10],
        [ 2, 11],
        [ 3, 12]],

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

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

svgewumm3#

除了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.]]])

相关问题