Преобразование 3D-массива numpy в Python в 3D-матрицу в Matlab [дубликат]

Минимальный пример с использованием mtcars - вам нужно создать кадр данных со средним значением для каждого gear (в вашем случае это Name).

library(tidyverse)
dMean <- mtcars %>%
    group_by(gear) %>%
    summarise(MN = mean(cyl))
ggplot(mtcars) +
    geom_point(aes(mpg, cyl)) +
    geom_hline(data = dMean, aes(yintercept = MN)) +
    facet_wrap(~ gear)

Для вас это должно работать :

library(tidyverse)
dMean <- UKWinners %>%
    group_by(Name) %>%
    summarise(MN = mean(TE.Contr.))
ggplot(UKWinners) +
    geom_point(aes(Pcode, TE.Contr.)) +
    geom_hline(data = dMean, aes(yintercept = MN)) +
    facet_wrap(~ Name)
25
задан Levon 12 June 2012 в 14:03
поделиться

5 ответов

Конечно, просто используйте scipy.io.savemat

. В качестве примера:

import numpy as np
import scipy.io

x = np.linspace(0, 2 * np.pi, 100)
y = np.cos(x)

scipy.io.savemat('test.mat', dict(x=x, y=y))

Аналогично, есть scipy.io.loadmat.

Затем вы загружаете это в matlab с load test.

Изменено, как было предложено в @JAB, вы можете просто сохранить вещи в файл с разделителем табуляции ascii (например, numpy.savetxt). Однако, если вы пройдете этот маршрут, вы будете ограничены двумя измерениями. С другой стороны, ascii - это универсальный обменный формат. Практически все будет обрабатывать текстовый файл с разделителями.

39
ответ дан Joe Kington 23 August 2018 в 23:23
поделиться

Не уверен, что он считается «более простым», но я нашел решение для перемещения данных из набора numpy, созданного в скрипте python, который довольно быстро вызывается matlab:

dump_reader.py (источник python ):

import numpy

def matlab_test2():
    np_a    = numpy.random.uniform(low = 0.0, high = 30000.0, size = (1000,1000))
    return np_a

dump_read.m (скрипт matlab):

clear classes
mod = py.importlib.import_module('dump_reader');
py.importlib.reload(mod);

if count(py.sys.path,'') == 0
    insert(py.sys.path,int32(0),'');
end

tic
A = py.dump_reader.matlab_test2();
toc
shape = cellfun(@int64,cell(A.shape));
ls = py.array.array('d',A.flatten('F').tolist());
p = double(ls);
toc
C = reshape(p,shape);
toc

Он полагается на то, что функция matlabs double эффективно работает с массивами по сравнению с ячейками / матрицами. Второй трюк состоит в том, чтобы эффективно передавать данные в matlabs double (через собственный массив pythons array.array).

P.S. извините за некропостинг, но я много боролся с этим, и эта тема была одним из ближайших хитов. Возможно, это помогает кому-то сократить время боев.

P.P.S. тестируется с помощью Matlab R2016b + python 3.5.4 (64 бит)

0
ответ дан John Smith 23 August 2018 в 23:23
поделиться

Простое решение без передачи данных файлом или внешними библиотеками.

У Numpy есть способ преобразования ndarrays в список, а типы данных Matlab могут быть определены из списков. Итак, когда можно преобразовать, как:

np_a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
mat_a = matlab.double(np_a.tolist())

От matlab до python требуется больше внимания. Нет встроенной функции для преобразования типа непосредственно в списки. Но мы можем получить доступ к необработанным данным, которые не сформированы, но понятны. Таким образом, мы используем reshape (для правильного форматирования) и transpose (из-за разных способов хранения данных MATLAB и numpy). Это очень важно подчеркнуть: протестируйте его в своем проекте, главным образом, если вы используете матрицы с более чем двумя измерениями. Он работает для MATLAB 2015a и 2 dims.

np_a = np.array(mat_a._data.tolist())
np_a = np_a.reshape(mat_a.size).transpose()
7
ответ дан Juliano ENS 23 August 2018 в 23:23
поделиться

Некоторое время назад я столкнулся с той же проблемой и написал следующие сценарии, чтобы упростить копирование и вставку массивов в интерактивные сеансы. Очевидно, что это практично только для небольших массивов, но я нашел его более удобным, чем сохранение / загрузку через файл каждый раз:

Matlab -> Python

Python -> Matlab

2
ответ дан robince 23 August 2018 в 23:23
поделиться

scipy.io.savemat или scipy.io.loadmat НЕ работает для массивов matlab --v7.3. Но хорошая часть состоит в том, что файлы matlab --v7.3 являются наборами данных hdf5. Поэтому они могут быть прочитаны с использованием нескольких инструментов, в том числе numpy.

Для python вам понадобится расширение h5py , для которого требуется HDF5 на вашем system.

import numpy as np, h5py 
f = h5py.File('somefile.mat','r') 
data = f.get('data/variable1') 
data = np.array(data) # For converting to numpy array
4
ответ дан vikrantt 23 August 2018 в 23:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: