首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python> rpy2数组:没有维度转换

Python> rpy2数组:没有维度转换
EN

Stack Overflow用户
提问于 2022-06-20 10:55:56
回答 1查看 45关注 0票数 1

目前,我正在尝试使用tibble包将复杂的嵌套rpy2从R复制到Python。由于Python不能很好地处理嵌套数据,所以我将数据分成两部分(元数据和几个时间序列),并将时间序列数据转换为R中的3D数组,到目前为止还不错,但是正如您所看到的,这里 R处理数组中与Python不同的维度。我希望rpy2能够自己转换维度,但正如您在我的MWE中所看到的,情况并非如此:

代码语言:javascript
复制
import rpy2.robjects as ro
import numpy as np

from rpy2.robjects import numpy2ri
from rpy2.robjects import default_converter
from rpy2.robjects.conversion import localconverter

ro.r(
    """
        f <- function() {
            data1 <- c(
                1, 2,  3,  4,
                5, 6,  7,  8,
                9, 10, 11, 12
            )
            data2 <- c(
                10, 20,  30,  40,
                50, 60,  70,  80,
                90, 100, 110, 120
            )
            result <- array(
                c(data1, data2),
                dim = c(4, 3, 2)
            )
            print(result)
            print(dim(result))
            return(result)
        }
    """
)

r_f = ro.globalenv["f"]
v_np = r_f()

print(type(v_np))
print("###################################")

with localconverter(default_converter + numpy2ri.converter) as cv:
    np_data_measurment = ro.conversion.rpy2py(v_np)

print(np_data_measurment)
print(type(np_data_measurment))
print(np_data_measurment.shape)
print("###################################")

np_good = np.array(
    [
        [
            [1, 5, 9],
            [2, 6, 10],
            [3, 7, 11],
            [4, 8, 12]],
        [
            [10, 50, 90],
            [20, 60, 100],
            [30, 70, 110],
            [40, 80, 120]],
    ]
)

print(np_good)
print(type(np_good))
print(np_good.shape)

print("###################################")
print(np_data_measurment.reshape(2, 4, 3, order='F'))

结果:,,1

代码语言:javascript
复制
     [,1] [,2] [,3]
[1,]    1    5    9
[2,]    2    6   10
[3,]    3    7   11
[4,]    4    8   12

, , 2

     [,1] [,2] [,3]
[1,]   10   50   90
[2,]   20   60  100
[3,]   30   70  110
[4,]   40   80  120

[1] 4 3 2
<class 'rpy2.robjects.vectors.FloatArray'>
###################################
[[[  1.  10.]
  [  5.  50.]
  [  9.  90.]]

 [[  2.  20.]
  [  6.  60.]
  [ 10. 100.]]

 [[  3.  30.]
  [  7.  70.]
  [ 11. 110.]]

 [[  4.  40.]
  [  8.  80.]
  [ 12. 120.]]]
<class 'numpy.ndarray'>
(4, 3, 2)
###################################
[[[  1   5   9]
  [  2   6  10]
  [  3   7  11]
  [  4   8  12]]

 [[ 10  50  90]
  [ 20  60 100]
  [ 30  70 110]
  [ 40  80 120]]]
<class 'numpy.ndarray'>
(2, 4, 3)
###################################
[[[  1.   9.  50.]
  [  3.  11.  70.]
  [  5.  10.  90.]
  [  7.  30. 110.]]

 [[  2.  10.  60.]
  [  4.  12.  80.]
  [  6.  20. 100.]
  [  8.  40. 120.]]]
(base) 

现在,我正在寻找一种将我的数据从R转换到Python的方法,以保持R数组的并行性。正如您所看到的,我还提供了一个示例,说明排序应该如何类似于np_good,并试图重塑糟糕的排序(但我更希望采用rpy2的方式重新构造数据)。

对于如何将3D数组从R复制到Python,同时保持维度不变,您是否知道,也许是自定义转换器?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-20 14:03:18

这可以归结为如何在内存中放置R和(C) numpy数组:r列优先,numpy行优先。

一个简单的解决方案是转置您的numpy数组:

代码语言:javascript
复制
np_data_measurment.transpose((2,1,0))

这会给你和R.

代码语言:javascript
复制
array([[[  1.,   2.,   3.,   4.],
        [  5.,   6.,   7.,   8.],
        [  9.,  10.,  11.,  12.]],

       [[ 10.,  20.,  30.,  40.],
        [ 50.,  60.,  70.,  80.],
        [ 90., 100., 110., 120.]]])

只要你不把这个转置数组放回R里,你就没事了。(如果你这样做的话,你需要重新定位。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72686029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档