Читая NumPy ndarrays в R? - PullRequest
       26

Читая NumPy ndarrays в R?

2 голосов
/ 04 апреля 2019

У меня есть 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 ]

6 голосов
/ 04 апреля 2019

Вы можете попытаться использовать reticulate , чтобы обернуть R вокруг существующего кода Python. Это немного новее, но довольно общий, поддерживающий многие типы.

В пакете RcppCNPy у меня есть виньетка , показывающая, как сетка может делать то, что делает RcppCNPy (конечно, за счет потенциально немного более сложная установка) так что, может быть, попробовать?

Опять же, виньетка здесь для вашего прочтения.

1 голос
/ 05 апреля 2019

Еще в 2016 году у меня была похожая проблема. Решение, которое придумали Авинаш Балакришнан и я, можно найти здесь:

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")      
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...