Spec-Zone.ru › NumPy 2.0

NumPy для пользователей MATLAB

Введение

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

Основные отличия

В MATLAB базовый тип, даже для скаляров, является многомерным массивом. Присваивания массивов в MATLAB хранятся как двумерные массивы с плавающей точкой двойной точности, если вы не укажете количество измерений и тип. Операции над двумерными экземплярами этих массивов моделируются на операциях с матрицами в линейной алгебре.

В NumPy базовый тип является многомерным array. Присваивания массивов в NumPy обычно хранятся как n-мерные массивы с минимальным типом, необходимым для хранения объектов в последовательности, если вы не укажете количество измерений и тип. NumPy выполняет операции элемент за элементом, поэтому умножение двумерных массивов с * не является умножением матриц — это умножение по элементам. (Оператор @, доступный с Python 3.5, можно использовать для обычного умножения матриц.)

В MATLAB индексы нумеруются с 1; a(1) является первым элементом. См. примечание ИНДЕКСИРОВАНИЕ

NumPy, как и Python, нумерует индексы с 0; a[0] является первым элементом.

Язык сценариев MATLAB был создан для линейной алгебры, поэтому синтаксис некоторых манипуляций с массивами более компактен, чем в NumPy. С другой стороны, API для добавления графических интерфейсов пользователя и создания полноценных приложений является, так сказать, вторичным.

NumPy основан на Python, универсальном языке программирования. Преимущество NumPy заключается в доступе к библиотекам Python, включая: SciPy, Matplotlib, Pandas, OpenCV и многое другое. Кроме того, Python часто встраивается в качестве языка сценариев в другие программы, что позволяет использовать NumPy и там.

Фрагментация массивов MATLAB использует семантику передачи по значению, с ленивой схемой копирования при записи, чтобы предотвратить создание копий до тех пор, пока они не понадобятся. Операции фрагментации копируют части массива.

Фрагментация массивов NumPy использует передачу по ссылке, которая не копирует аргументы. Операции фрагментации являются представлениями в массиве.

Приблизительные эквиваленты

В таблице ниже приведены приблизительные эквиваленты некоторых распространенных выражений MATLAB. Это подобные выражения, а не эквиваленты. Подробности см. в документации.

В таблице ниже предполагается, что вы выполнили следующие команды в Python:

import numpy as np
from scipy import io, integrate, linalg, signal
from scipy.sparse.linalg import cg, eigs

Также предполагается, что, если в примечаниях говорится о «матрице», то аргументы являются двумерными сущностями.

Общие эквиваленты

MATLAB

NumPy

Примечания

help func

info(func) или help(func) или func? (в IPython)

получить справку по функции func

which func

см. примечание СПРАВКА

узнать, где определена func

type func

np.source(func) или func?? (в IPython)

вывести исходный код для func (если это не встроенная функция)

% comment

# comment

комментировать строку кода текстом comment

for i=1:3
    fprintf('%i\n',i)
end
for i in range(1, 4):
   print(i)

использовать цикл for для печати чисел 1, 2 и 3 с использованием range

a && b

a and b

оператор логического И с короткой цепочкой вычислений (встроенный оператор Python); только скалярные аргументы

a || b

a or b

оператор логического ИЛИ с короткой цепочкой вычислений (встроенный оператор Python); только скалярные аргументы

>> 4 == 4
ans = 1
>> 4 == 5
ans = 0
>>> 4 == 4
True
>>> 4 == 5
False

Объекты булевых типов в Python равны True и False, в отличие от логических типов MATLAB 1 и 0.

a=4
if a==4
    fprintf('a = 4\n')
elseif a==5
    fprintf('a = 5\n')
end
a = 4
if a == 4:
    print('a = 4')
elif a == 5:
    print('a = 5')

создать оператор if-else для проверки, равен ли a 4 или 5 и вывести результат

1*i, 1*j, 1i, 1j

1j

комплексные числа

eps

np.finfo(float).eps или np.spacing(1)

расстояние от 1 до ближайшего большего представимого действительного числа в формате двойной точности

load data.mat

io.loadmat('data.mat')

Загрузить переменные MATLAB, сохраненные в файле data.mat. (Примечание: при сохранении массивов в data.mat в MATLAB/Octave используйте современный двоичный формат. scipy.io.loadmat создаст словарь сохраненных массивов и дополнительной информацией.)

ode45

integrate.solve_ivp(f)

интегрировать обыкновенное дифференциальное уравнение с помощью метода Рунге-Кутта 4,5

ode15s

integrate.solve_ivp(f, method='BDF')

интегрировать обыкновенное дифференциальное уравнение с помощью метода BDF

Эквиваленты линейной алгебры

MATLAB

NumPy

Примечания

ndims(a)

np.ndim(a) или a.ndim

количество измерений массива a

numel(a)

np.size(a) или a.size

количество элементов массива a

size(a)

np.shape(a) или a.shape

«размер» массива a

size(a,n)

a.shape[n-1]

получить количество элементов n-го измерения массива a. (Обратите внимание, что MATLAB использует индексацию с 1, а Python — с 0. См. примечание ИНДЕКСИРОВАНИЕ)

[ 1 2 3; 4 5 6 ]

np.array([[1., 2., 3.], [4., 5., 6.]])

определить двумерный массив 2x3

[ a b; c d ]

np.block([[a, b], [c, d]])

построить матрицу из блоков a, b, c, и d

a(end)

a[-1]

доступ к последнему элементу в векторе MATLAB (1xn или nx1) или одномерном массиве NumPy a (длина n)

a(2,5)

a[1, 4]

доступ к элементу во второй строке, пятом столбце двумерного массива a

a(2,:)

a[1] или a[1, :]

вся вторая строка двумерного массива a

a(1:5,:)

a[0:5] или a[:5] или a[0:5, :]

первые 5 строк двумерного массива a

a(end-4:end,:)

a[-5:]

последние 5 строк двумерного массива a

a(1:3,5:9)

a[0:3, 4:9]

Первые три строки и пятый по девятый столбцы двумерного массива, a.

a([2,4,5],[1,3])

a[np.ix_([1, 3, 4], [0, 2])]

строки 2, 4 и 5 и столбцы 1 и 3. Это позволяет изменять матрицу и не требует обычного среза.

a(3:2:21,:)

a[2:21:2,:]

каждая вторая строка a, начиная с третьей и заканчивая двадцать первой

a(1:2:end,:)

a[::2, :]

каждая вторая строка a, начиная с первой

a(end:-1:1,:) или flipud(a)

a[::-1,:]

a со строками в обратном порядке

a([1:end 1],:)

a[np.r_[:len(a),0]]

a с копией первой строки, добавленной в конец

a.'

a.transpose() или a.T

транспонирование a

a'

a.conj().transpose() или a.conj().T

сопряженное транспонирование a

a * b

a @ b

умножение матриц

a .* b

a * b

умножение по элементам

a./b

a/b

деление по элементам

a.^3

a**3

возведение в степень по элементам

(a > 0.5)

(a > 0.5)

матрица, i,j-й элемент которой равен (a_ij > 0.5). Результат MATLAB — массив логических значений 0 и 1. Результат NumPy — массив булевых значений False и True.

find(a > 0.5)

np.nonzero(a > 0.5)

найти индексы, где (a > 0.5)

a(:,find(v > 0.5))

a[:,np.nonzero(v > 0.5)[0]]

извлечь столбцы a где вектор v > 0.5

a(:,find(v>0.5))

a[:, v.T > 0.5]

извлечь столбцы a где столбец-вектор v > 0.5

a(a<0.5)=0

a[a < 0.5]=0

a с элементами, меньшими 0.5, обнулёнными

a .* (a>0.5)

a * (a > 0.5)

a с элементами, меньшими 0.5, обнулёнными

a(:) = 3

a[:] = 3

установить все значения на одно скалярное значение

y=x

y = x.copy()

NumPy присваивает по ссылке

y=x(2,:)

y = x[1, :].copy()

Срезы NumPy по ссылке

y=x(:)

y = x.flatten()

преобразовать массив в вектор (обратите внимание, что это принудительно создаёт копию). Чтобы получить такой же порядок данных, как в MATLAB, используйте x.flatten('F').

1:10

np.arange(1., 11.) или np.r_[1.:11.] или np.r_[1:10:10j]

создание возрастающего вектора (см. примечание ДИАПАЗОНЫ)

0:9

np.arange(10.) или np.r_[:10.] или np.r_[:9:10j]

создание возрастающего вектора (см. примечание ДИАПАЗОНЫ)

[1:10]'

np.arange(1.,11.)[:, np.newaxis]

создание столбца-вектора

zeros(3,4)

np.zeros((3, 4))

двумерный массив 3x4, заполненный нулями с плавающей точкой двойной точности (64 бита)

zeros(3,4,5)

np.zeros((3, 4, 5))

трёхмерный массив 3x4x5, заполненный нулями с плавающей точкой двойной точности (64 бита)

ones(3,4)

np.ones((3, 4))

двумерный массив 3x4, заполненный единицами с плавающей точкой двойной точности (64 бита)

eye(3)

np.eye(3)

единичная матрица 3x3

diag(a)

np.diag(a)

возвращает вектор диагональных элементов двумерного массива, a

diag(v,0)

np.diag(v, 0)

возвращает квадратную диагональную матрицу, ненулевые значения которой — элементы вектора, v

rng(42,'twister')
rand(3,4)
from numpy.random import default_rng
rng = default_rng(42)
rng.random(3, 4)

или более старая версия: random.rand((3, 4))

сгенерировать случайный массив 3x4 с генератором случайных чисел по умолчанию и seed = 42

linspace(1,3,4)

np.linspace(1,3,4)

4 равномерно распределённых образца между 1 и 3 включительно

[x,y]=meshgrid(0:8,0:5)

np.mgrid[0:9.,0:6.] или np.meshgrid(r_[0:9.],r_[0:6.])

два двумерных массива: один с x-значениями, другой с y-значениями

ogrid[0:9.,0:6.] или np.ix_(np.r_[0:9.],np.r_[0:6.]

наиболее эффективный способ вычисления функций на сетке

[x,y]=meshgrid([1,2,4],[2,4,5])

np.meshgrid([1,2,4],[2,4,5])

np.ix_([1,2,4],[2,4,5])

наиболее эффективный способ вычисления функций на сетке

repmat(a, m, n)

np.tile(a, (m, n))

создать m на n копий a

[a b]

np.concatenate((a,b),1) или np.hstack((a,b)) или np.column_stack((a,b)) или np.c_[a,b]

склеить столбцы a и b

[a; b]

np.concatenate((a,b)) или np.vstack((a,b)) или np.r_[a,b]

склеить строки a и b

max(max(a))

a.max() или np.nanmax(a)

максимальный элемент a (с ndims(a)<=2 для MATLAB, если есть NaN, nanmax проигнорирует их и вернёт наибольшее значение)

max(a)

a.max(0)

максимальный элемент каждого столбца массива a

max(a,[],2)

a.max(1)

максимальный элемент каждой строки массива a

max(a,b)

np.maximum(a, b)

сравнивает a и b поэлементно и возвращает максимальное значение из каждой пары

norm(v)

np.sqrt(v @ v) или np.linalg.norm(v)

норма L2 вектора v

a & b

logical_and(a,b)

поэлементный оператор AND (ufunc NumPy) См. примечание LOGICOPS

a | b

np.logical_or(a,b)

поэлементный оператор OR (ufunc NumPy) См. примечание LOGICOPS

bitand(a,b)

a & b

оператор поразрядного И (встроенный в Python и ufunc NumPy)

bitor(a,b)

a | b

оператор поразрядного ИЛИ (встроенный в Python и ufunc NumPy)

inv(a)

linalg.inv(a)

обратная матрица квадратной 2D матрицы a

pinv(a)

linalg.pinv(a)

псевдообратная 2D матрица a

rank(a)

np.linalg.matrix_rank(a)

ранг матрицы 2D массива a

a\b

linalg.solve(a, b) если a квадратная; linalg.lstsq(a, b) в противном случае

решение уравнения a x = b для x

b/a

Решить a.T x.T = b.T вместо

решение уравнения x a = b для x

[U,S,V]=svd(a)

U, S, Vh = linalg.svd(a); V = Vh.T

разложение по сингулярным значениям a

chol(a)

linalg.cholesky(a)

разложение Холецкого 2D массива

[V,D]=eig(a)

D,V = linalg.eig(a)

собственные значения \(\lambda\) и собственные векторы \(v\) a, где \(\mathbf{a} v = \lambda v\)

[V,D]=eig(a,b)

D,V = linalg.eig(a, b)

собственные значения \(\lambda\) и собственные векторы \(v\) a, b где \(\mathbf{a} v = \lambda \mathbf{b} v\)

[V,D]=eigs(a,3)

D,V = eigs(a, k=3)

найти k=3 наибольшие собственные значения и собственные векторы 2D массива, a

[Q,R]=qr(a,0)

Q,R = linalg.qr(a)

QR-разложение

[L,U,P]=lu(a) где a==P'*L*U

P,L,U = linalg.lu(a) где a == P@L@U

LU-разложение с частичным выбором ведущего элемента (примечание: P(MATLAB) == transpose(P(NumPy)))

conjgrad

cg

решение методом сопряжённых градиентов

fft(a)

np.fft.fft(a)

преобразование Фурье a

ifft(a)

np.fft.ifft(a)

обратное преобразование Фурье a

sort(a)

np.sort(a) или a.sort(axis=0)

сортировка каждой колонки 2D массива, a

sort(a, 2)

np.sort(a, axis=1) или a.sort(axis=1)

сортировка каждой строки 2D массива, a

[b,I]=sortrows(a,1)

I = np.argsort(a[:, 0]); b = a[I,:]

сохранить массив a как массив b со строками, отсортированными по первой колонке

x = Z\y

x = linalg.lstsq(Z, y)

выполнить линейную регрессию вида \(\mathbf{Zx}=\mathbf{y}\)

decimate(x, q)

signal.resample(x, np.ceil(len(x)/q))

децимация с применением фильтра нижних частот

unique(a)

np.unique(a)

вектор уникальных значений в массиве a

squeeze(a)

a.squeeze()

удаление одноэлементных размерностей массива a. Обратите внимание, что MATLAB всегда возвращает массивы 2D или выше, а NumPy — 0D или выше

Примечания

Подматрица: Присвоение подматрицы может быть выполнено с использованием списков индексов с помощью команды ix_. Например, для 2D массива a, можно сделать так: ind=[1, 3]; a[np.ix_(ind, ind)] += 100.

Справка: Нет прямого эквивалента команды MATLAB which, но команды help обычно отображают имя файла, в котором находится функция. Python также имеет модуль inspect (выполните import inspect), который предоставляет инструмент getfile часто работающий.

ИНДЕКСИРОВАНИЕ: MATLAB использует индексирование с единицы, поэтому начальный элемент последовательности имеет индекс 1. Python использует нулевое индексирование, поэтому начальный элемент последовательности имеет индекс 0. Путаница и споры возникают из-за того, что у каждого есть свои плюсы и минусы. Индексирование с единицы соответствует обычному использованию человеческой речи, где «первый» элемент последовательности имеет индекс 1. Нулевое индексирование упрощает индексирование. См. также текст профессора Эдсгера В. Дейкстры.

ДИАПАЗОНЫ: В MATLAB, 0:5 может использоваться как литерал диапазона, так и индекс «срезов» (в скобках); однако в Python конструкции вроде 0:5 только могут использоваться как индексы срезов (в квадратных скобках). Поэтому был создан несколько необычный объект r_, чтобы позволить NumPy иметь аналогичный лаконичный механизм построения диапазонов. Обратите внимание, что r_ не вызывается как функция или конструктор, а индексируется с использованием квадратных скобок, что позволяет использовать синтаксис срезов Python в аргументах.

ЛОГИЧЕСКИЕ ОПЕРАТОРЫ: & или | в NumPy — поразрядные И/ИЛИ, в то время как в MATLAB & и | — логическое И/ИЛИ. Они могут работать одинаково, но есть важные различия. Если вы использовали бы операторы MATLAB & или |, то вам следует использовать NumPy ufunc logical_and/logical_or. Отличия между операторами MATLAB & и | NumPy:

  • Ввод нелогического типа {0,1}: вывод NumPy — поразрядное И входных данных. MATLAB рассматривает любое ненулевое значение как 1 и возвращает логическое И. Например, (3 & 4) в NumPy — 0, в то время как в MATLAB и 3 и 4 считаются логически истинными и (3 & 4) возвращает 1.
  • Приоритет: оператор & NumPy имеет больший приоритет, чем логические операторы, такие как < и >, в MATLAB — наоборот.

Если вы знаете, что у вас есть булевы аргументы, вы можете обойтись операторами NumPy, но будьте внимательны с круглыми скобками, например, так: z = (x > 1) & (x < 2). Отсутствие операторных форм NumPy logical_and и logical_or — следствие дизайна Python.

RESHAPE и ЛИНЕЙНОЕ ИНДЕКСИРОВАНИЕ: MATLAB всегда позволяет многомерным массивам быть доступными с использованием скалярных или линейных индексов, NumPy — нет. Линейные индексы часто встречаются в программах MATLAB, например, find() на матрице возвращает их, в то время как NumPy’s find ведет себя иначе. При конвертации кода MATLAB может потребоваться сначала преобразовать матрицу в линейную последовательность, выполнить операции индексирования, а затем преобразовать обратно. Поскольку reshape (обычно) создаёт представления по одному хранилищу, это должно быть выполнено достаточно эффективно. Обратите внимание, что порядок сканирования, используемый reshape в NumPy, по умолчанию — ‘C’ порядок, в то время как MATLAB использует порядок Fortran. Если вы просто преобразуете в линейную последовательность и обратно, это не имеет значения. Но если вы преобразуете перестановки из кода MATLAB, который полагается на порядок сканирования, то этот код MATLAB: z = reshape(x,3,4); должен стать z = x.reshape(3,4,order='F').copy() в NumPy.

‘array’ или ‘matrix’? Какой тип использовать?

Исторически NumPy предоставлял специальный тип матриц, np.matrix, который является подклассом ndarray и делает бинарные операции операциями линейной алгебры. Вы можете видеть его использование в некоторых существующих кодах вместо np.array. Так какой тип использовать?

Краткий ответ

Используйте массивы.

  • Они поддерживают многомерную алгебру массивов, которая поддерживается в MATLAB
  • Они являются стандартным типом векторов/матриц/тензоров в NumPy. Многие функции NumPy возвращают массивы, а не матрицы.
  • Существует чёткое различие между поэлементными операциями и операциями линейной алгебры.
  • Вы можете иметь стандартные векторы или векторы строки/столбца, если хотите.

До Python 3.5 единственным недостатком использования типа массива было то, что вам приходилось использовать dot вместо * для умножения (сведения) двух тензоров (скалярное произведение, умножение матрицы на вектор и т. д.). С Python 3.5 вы можете использовать оператор умножения матриц @.

Учитывая вышесказанное, мы намерены в конечном итоге устареть matrix.

Подробный ответ

NumPy содержит как класс array, так и класс matrix. Класс array предназначен для использования в качестве многомерного массива общего назначения для различных видов численных вычислений, в то время как matrix предназначен для упрощения вычислений линейной алгебры. На практике между ними есть лишь несколько ключевых отличий.

  • Операторы * и @, функции dot(), и multiply().

    • Для array, ``*`` означает поэлементное умножение, а ``@`` означает умножение матриц; они имеют связанные функции multiply() и dot(). (До Python 3.5 @ не существовало, и для умножения матриц нужно было использовать dot()).
    • Для matrix, ``*`` означает умножение матриц, а для поэлементного умножения нужно использовать функцию multiply().
  • Обработка векторов (одномерные массивы)

    • Для array, формы векторов 1xN, Nx1 и N - это разные вещи. Такие операции, как A[:,1], возвращают одномерный массив формы N, а не двумерный массив формы Nx1. Транспонирование одномерного array ничего не делает.
    • Для matrix, одномерные массивы всегда повышаются до 1xN или Nx1 матриц (векторов строки или столбца). A[:,1] возвращает двумерную матрицу формы Nx1.
  • Обработка многомерных массивов (ndim > 2)

    • array объекты могут иметь количество измерений > 2;
    • matrix объекты всегда имеют ровно два измерения.
  • Удобные атрибуты

    • array имеет атрибут .T, который возвращает транспонированное данные.
    • matrix также имеет атрибуты .H, .I и .A, которые возвращают сопряжённо-транспонированную, обратную и asarray() матрицы соответственно.
  • Удобный конструктор

    • Конструктор array принимает (вложенные) Python последовательности в качестве инициализаторов. Как в array([[1,2,3],[4,5,6]]).
    • Конструктор matrix дополнительно принимает удобную строковую инициализацию. Как в matrix("[1 2 3; 4 5 6]").

Использование обоих типов имеет свои преимущества и недостатки:

  • array

    • :) Поэлементное умножение легко выполняется: A*B.
    • :( Вам нужно помнить, что умножение матриц имеет свой оператор @.
    • :) Вы можете рассматривать одномерные массивы как либо векторы строки, либо векторы столбца. A @ v рассматривает v как вектор столбца, а v @ A рассматривает v как вектор строки. Это может сэкономить вам много написания транспонирования.
    • :) array является "стандартным" типом NumPy, поэтому он проходит наибольшее тестирование и является типом, который чаще всего возвращают сторонние библиотеки, использующие NumPy.
    • :) Хорошо справляется с обработкой данных любого количества измерений.
    • :) Ближе к семантике алгебры тензоров, если вы с ней знакомы.
    • :) Все операции (*, /, +, - и т. д.) являются поэлементными.
    • :( Разреженные матрицы из scipy.sparse не взаимодействуют так хорошо с массивами.
  • matrix

    • :\\ Поведение более похоже на поведение матриц в MATLAB.
    • <:( Максимально двумерный. Для хранения трехмерных данных вам нужен array или, возможно, Python список matrix.
    • <:( Минимально двумерный. У вас не может быть векторов. Они должны быть преобразованы в матрицы с одним столбцом или одной строкой.
    • <:( Поскольку array является стандартным в NumPy, некоторые функции могут возвращать array даже если вы передаете им matrix в качестве аргумента. Это не должно происходить с функциями NumPy (если это происходит, это ошибка), но сторонние библиотеки, основанные на NumPy, могут не сохранять тип данных, как это делает NumPy.
    • :) A*B представляет умножение матриц, поэтому выглядит так же, как вы это записываете в линейной алгебре (для Python ≥ 3.5 обычные массивы имеют ту же удобство с оператором @).
    • <:( Поэлементное умножение требует вызова функции multiply(A,B).
    • <:( Использование перегрузки операторов немного нелогично: * не работает поэлементно, но / работает.
    • Взаимодействие с scipy.sparse немного чище.

Таким образом, использование array гораздо предпочтительнее. Действительно, мы намерены в конечном итоге устареть matrix.

Настройка вашей среды

В MATLAB основным инструментом для настройки среды является изменение пути поиска с местоположениями ваших любимых функций. Вы можете поместить такие настройки в скрипт запуска, который MATLAB будет запускать при запуске.

NumPy, или скорее Python, имеют аналогичные возможности.

  • Чтобы изменить путь поиска Python, включив расположения собственных модулей, определите переменную среды PYTHONPATH.
  • Чтобы запустить определенный скрипт при запуске интерактивного интерпретатора Python, определите переменную среды PYTHONSTARTUP для содержанием имени вашего скрипта запуска.

В отличие от MATLAB, где всё в вашем пути можно вызвать сразу, в Python вам сначала необходимо выполнить оператор «import», чтобы сделать функции в конкретном файле доступными.

Например, вы можете создать скрипт запуска, который выглядит так (Примечание: это просто пример, а не «лучшие практики»):

# Make all numpy available via shorter 'np' prefix
import numpy as np
#
# Make the SciPy linear algebra functions available as linalg.func()
# e.g. linalg.lu, linalg.eig (for general l*B@u==A@u solution)
from scipy import linalg
#
# Define a Hermitian function
def hermitian(A, **kwargs):
    return np.conj(A,**kwargs).T
# Make a shortcut for hermitian:
#    hermitian(A) --> H(A)
H = hermitian

Чтобы использовать устаревшие matrix и другие matlib функции:

# Make all matlib functions accessible at the top level via M.func()
import numpy.matlib as M
# Make some matlib functions accessible directly at the top level via, e.g. rand(3,3)
from numpy.matlib import matrix,rand,zeros,ones,empty,eye

Ссылки

Другая несколько устаревшая ссылка MATLAB/NumPy можно найти по адресу http://mathesaurus.sf.net/

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

См. Список программного обеспечения Python: скрипты, чтобы узнать список программного обеспечения, которое использует Python как язык сценариев

MATLAB® и SimuLink® являются зарегистрированными товарными знаками компании The MathWorks, Inc.

© 2005–2024 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/2.0/user/numpy-for-matlab-users.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API