[英]rpy2 R->Python data.frame: bad NA and custom converter
[英]rpy2 R->Python array: no dimension translation
目前我正在嘗試使用rpy2
package 將一個復雜的嵌套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 arrays 從 R 復制到 Python,同時保持尺寸不變,您有什么想法嗎?
這歸結為 IMO 是 R 和(基於 C 的)numpy arrays 在 memory 中的布局方式: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,就可以了。 (如果你這樣做,你需要重新轉置。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.