Массивы MATLAB как переменные Python

Пакет matlab Python® обеспечивает классы массивов, чтобы представлять массивы MATLAB® числовые типы как переменные Python так, чтобы массивы MATLAB могли быть переданы между Python и MATLAB.

Создание массивов MATLAB в Python

Можно создать числовые массивы MATLAB на сеансе Python путем вызова конструкторов от пакета Python matlab (например, matlab.double, matlab.int32). Имя конструктора указывает на MATLAB числовой тип.

Можно использовать пользовательские типы для инициализации двойных массивов MATLAB в Python. Пользовательский тип должен наследовать от Абстрактного базового класса Python collections.Sequence, который будет использоваться в качестве инициализатора.

Можно передать массивы MATLAB как входные параметры к функциям, вызванным с API MATLAB Engine для Python. Когда функция MATLAB возвращает числовой массив как выходной аргумент, механизм возвращает массив в Python.

Можно инициализировать массив с дополнительным входным параметром initializer, который содержит числа. initializer должен быть типом последовательности Python, таким как list, tuple или другой тип последовательности. Дополнительный входной параметр size устанавливает размер массивов от последовательности. Можно создать многомерные массивы путем определения initializer, чтобы содержать несколько последовательностей чисел, или путем определения size, чтобы быть многомерными. Можно создать массив MATLAB комплексных чисел путем установки дополнительного входного параметра is_complex на True. Пакет matlab предоставляет перечисленных в таблице конструкторов Array MATLAB.

Класс matlab

Вызов конструктора в Python

matlab.double

matlab.double(initializer=None, size=None, is_complex=False)

matlab.single

matlab.single(initializer=None, size=None, is_complex=False)

matlab.int8

matlab.int8(initializer=None, size=None, is_complex=False)

matlab.int16

matlab.int16(initializer=None, size=None, is_complex=False)

matlab.int32

matlab.int32(initializer=None, size=None, is_complex=False)

matlab.int64

matlab.int64(initializer=None, size=None, is_complex=False)

matlab.uint8

matlab.uint8(initializer=None, size=None, is_complex=False)

matlab.uint16

matlab.uint16(initializer=None, size=None, is_complex=False)

matlab.uint32

matlab.uint32(initializer=None, size=None, is_complex=False)

matlab.uint64 [b]

matlab.uint64(initializer=None, size=None, is_complex=False)

matlab.logical

matlab.logical(initializer=None, size=None) [c]

matlab.object

Никакой конструктор. Когда функция возвращает указатель или объект значения к объекту MATLAB, механизм возвращает matlab.object в Python.

[a]  В Python 2.7 на Windows matlab.int64 преобразован в int32 в MATLAB. Кроме того, MATLAB не может возвратить массив int64 в Python.

[b]  В Python 2.7 на Windows matlab.uint64 преобразован в uint32 в MATLAB. Кроме того, MATLAB не может возвратить массив uint64 в Python.

[c]  Logicals не может быть превращен в массив комплексных чисел.

Когда вы создаете массив с элементами N, размер 1 N, потому что это - массив MATLAB.

import matlab.engine
A = matlab.int8([1,2,3,4,5])
print(A.size)
(1, 5)

Инициализатором является list Python, содержащий пять чисел. Размер массивов MATLAB 1 на 5, обозначается tuple, (1,5).

Атрибуты массивов MATLAB и методы в Python

Все массивы MATLAB, созданные с конструкторами пакета matlab, имеют атрибуты и методы, перечисленные в этой таблице.

Атрибут или метод

Цель

size

Размер массива, возвращенного как tuple

reshape(size)

Изменение размерности массива, как задано последовательностью size

Многомерные массивы MATLAB в Python

В Python можно создать многомерные массивы MATLAB любого числового типа. Используйте две переменные Python list, чтобы создать 2 5, массив MATLAB удваивается.

import matlab.engine
A = matlab.double([[1,2,3,4,5], [6,7,8,9,10]])
print(A)
[[1.0,2.0,3.0,4.0,5.0],[6.0,7.0,8.0,9.0,10.0]]

Атрибут size A показывает, что это 2 5 массив.

print(A.size)
(2, 5)

Индексация в массивы MATLAB в Python

Можно индексировать в массивы MATLAB, как можно индексировать в переменные Python list и tuple.

import matlab.engine
A = matlab.int8([1,2,3,4,5])
print(A[0])
[1,2,3,4,5]

Размером массива MATLAB является (1,5); поэтому, A[0] является [1,2,3,4,5]. Индексируйте в массив, чтобы добраться 3.

print(A[0][2])
3

Индексация Python основана на нуле. Когда вы получаете доступ к элементам массивов MATLAB на сеансе Python, используете основанную на нуле индексацию.

Индексируйте в многомерный массив MATLAB.

A = matlab.double([[1,2,3,4,5], [6,7,8,9,10]])
print(A[1][2])
8.0

Срез массивы MATLAB в Python

Можно резать, MATLAB выстраивает тот же способ, которым вы нарезаете переменные Python list и tuple.

import matlab.engine
A = matlab.int8([1,2,3,4,5])
print(A[0][1:4])
[2,3,4]

Можно присвоить данные срезу. Этот код показывает присвоение от list Python до среза массива.

A = matlab.double([[1,2,3,4],[5,6,7,8]]);
A[0] = [10,20,30,40]
print(A)
[[10.0,20.0,30.0,40.0],[5.0,6.0,7.0,8.0]]

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

Можно задать срезы для присвоения как показано здесь.

A = matlab.int8([1,2,3,4,5,6,7,8]);
A[0][2:4] = [30,40]
A[0][6:8] = [70,80]
print(A)
[[1,2,30,40,5,6,70,80]]

Примечание

Разрезание массивов MATLAB ведет себя по-другому по сравнению с разрезанием list Python. Разрезание массива MATLAB возвращает представление вместо мелкой копии.

Учитывая массив MATLAB и list Python с теми же значениями, присваивая срез результаты в различных результатах как показано следующим кодом.

A = matlab.int32([[1,2],[3,4],[5,6]])
L = [[1,2],[3,4],[5,6]]
A[0] = A[0][::-1]
L[0] = L[0][::-1]
print(A)
[[2,2],[3,4],[5,6]]
print(L)
[[2, 1], [3, 4], [5, 6]]

Изменение размерность массивов MATLAB в Python

Можно изменить размерность массива MATLAB в Python с методом reshape. size входного параметра должен быть последовательностью, которая сохраняет число элементов. Используйте reshape, чтобы измениться 1 9 массив MATLAB к 3х3.

import matlab.engine
A = matlab.int8([1,2,3,4,5,6,7,8,9])
A.reshape((3,3))
print(A)
[[1,4,7],[2,5,8],[3,6,9]]

Похожие темы