将numpy ndarrays读入R?

时间:2019-04-04 16:56:04

标签: python arrays r numpy rcpp

我有一个3维的numpy ndarray,已作为.npy文件保存到磁盘。我想将其引入R以应用一些未在python中实现的统计函数。有方便的方法吗? RcppCNPy尚未推广到3+维度,至少目前还没有。

我总是可以在python端以其他不同的格式保存数组,但这会不太方便并且更容易出错。

这里有一些虚拟数据:

import numpy as np
goats_are_super = np.array(list(range(24))).reshape(4,3,2)
np.save("goats_are_super", goats_are_super)

2 个答案:

答案 0 :(得分:6)

您可以尝试使用reticulate从R环绕现有的Python代码。这是一个较新的版本,但相当通用,支持许多类型。

RcppCNPy软件包中,我有vignette展示了reticulate如何完成RcppCNPy的工作(当然,这可能会涉及更多的安装工作),所以也许尝试一下?

同样,小插图是here,供您细读。

答案 1 :(得分:1)

早在2016年,我遇到了类似的问题。可以在这里找到Avinash Balakrishnan和我自己想出的解决方案:

http://thecoatlessprofessor.com/programming/numpy-arrays-to-r-array-objects/

简而言之,我们使用rpy2来处理NumPy到 R 数组的转换。

import os, sys, getopt
import numpy as np
import re

from rpy2.robjects import r
from rpy2.robjects.numpy2ri import numpy2ri

def convert_numpy(path_to_data, fname, export_dir):
    """Convert NumPy N-D array to R object

    Keyword arguments:
    path_to_data -- full dir path to data
    fname        -- partial file name to match
    export_dir   -- Name of export dir added to data dir
    """  
    # Create a directory path
    if not os.path.exists("%s/%s" % (path_to_data,export_dir)):
        os.makedirs("%s/%s" % (path_to_data,export_dir))

    # Get list of files in the directory
    files = os.listdir(path_to_data)

    # Sort out which files are of each type
    numpy_files = sorted([f for f in files if fname in f])

    # Begin process conversion
    for numpy_fname in numpy_files:

        # Load in 4D Numpy Array
        d = np.load("%s/%s" % (path_to_data, numpy_fname))

        # Remove the file extension of .npy binary
        file_name = re.sub('\.npy$', '', numpy_fname)

        # Convert the numpy object to R
        ro = numpy2ri(d)

        # Assign the name
        r.assign("%s" % file_name,ro)

        # Export to .gzip readable by R's load() 
        r("save(%s, file='%s/%s/%s.gzip', compress=TRUE)" % (file_name,path_to_data,export_dir,file_name))

可以使用以下命令将其读入 R

load("a_patches_b1.gzip")