【问题标题】:Reading numpy ndarrays into R?将numpy ndarrays读入R?
【发布时间】:2019-08-26 12:38:29
【问题描述】:

我有一个三个维度的 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)

【问题讨论】:

标签: python arrays r numpy rcpp


【解决方案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")      

【讨论】:

  • 更简单的基于reticulate 的答案现已作为小插图的补充提交,请参阅github.com/eddelbuettel/rcppcnpy/commit/…
  • @eddelbuettel 无意冒犯,但这并不是真正的竞争,而是出现在reticulate 之前。 reticulate 解决方案比 rpy2 变体更好。
  • 我会删除这个。
  • “补丁”未找到。它应该是什么?您是否还设法在常规 python 3 或仅在 anaconda 上安装它?(我正在尝试在两者中实现它但遇到问题)
  • 应该换成d
【解决方案2】:

您可以尝试使用reticulate 从 R 包装现有的 Python 代码。这有点新,但非常普遍,支持多种类型。

RcppCNPy 包中,我有vignette 显示reticulate 可以做RcppCNPy 所做的事情(当然代价是可能会涉及更多的安装)所以不妨试试看?

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

【讨论】:

  • 太棒了。还要感谢@J_F,他提出了我在写答案时没有看到的建议。如果你想在小插图中添加一个段落,你可以把它画出来并发送给我,或者将它作为一个问题提交给 GH repo for RcppCNPy 吗?
  • 完成:检查你的 github。再次感谢!
  • 为我省去了很多麻烦。惊人的!谢谢!
猜你喜欢
  • 2020-06-07
  • 1970-01-01
  • 2016-02-10
  • 2018-06-22
  • 2020-11-26
  • 2011-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多