Подтвердить что ты не робот

"Преобразование" массивов Nump в Matlab и наоборот

Я ищу способ передать массивы NumPy в Matlab.

Мне удалось сделать это, сохранив массив в изображении с помощью scipy.misc.imsave, а затем загрузив его с помощью imread, но это, конечно, заставляет матрицу содержать значения от 0 до 256 вместо "реального", значения.

Принимая произведение этой матрицы, деленное на 256, а максимальное значение в исходном массиве NumPy дает мне правильную матрицу, но я чувствую, что это немного утомительно.

существует более простой способ?

4b9b3361

Ответ 1

Конечно, просто используйте 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 - это универсальный обменный формат. Практически все будет обрабатывать текстовый файл с разделителями.

Ответ 2

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

У 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()

Ответ 3

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

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

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

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

Matlab → Python

Python → Matlab