rpy2 R->Python 数组:无维度转换



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

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

[,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,同时保持尺寸完整?

这归结为IMO是如何在内存中布局R和(基于c的)numpy数组:R -列优先,numpy -行优先。

一个简单的解决方案是调换numpy数组:

np_data_measurment.transpose((2,1,0))

这将给出与r相同的显示。

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,你就会没事。(如果你这样做,你需要重新转置)

相关内容

  • 没有找到相关文章

最新更新