Сравнение кодов Matlab и Numpy для воспроизведения случайных чисел и массивов

Как мы знаем, Numpy - известная библиотека Python для поддержки матричных вычислений в Python, а также большой набор высокоуровневых математических функций для работы с векторными, матричными и тензорными массивами [1]. Matlab - это язык программирования и вычислительная среда, поддерживающая матричные вычисления, построение графиков функций и данных, реализацию алгоритмов, создание интерфейсов и взаимодействие с программами, написанными на других языках [2].

Общей чертой Numpy и Matlab является их широкое использование в матричных вычислениях и численных вычислениях. Однако это не совсем то же самое. В этом посте мы обсудим, как генерировать случайные числа и массивы как в Matlab, так и в Numpy. В частности, мы проводим сравнение между Matlab и Numpy для воспроизведения одних и тех же случайных чисел и массивов.

Случайные числа и массивы

И Matlab, и Numpy могут генерировать случайные числа и массивы в соответствии с определенной командой. Есть две важные концепции:

  • Распределение случайных чисел
  • Случайное начальное число

Для распределений случайных чисел мы обычно учитываем равномерное распределение и стандартное нормальное (гауссово) распределение. В Numpy мы можем использовать numpy.random.rand для генерации равномерно распределенных случайных чисел. В Matlab мы можем использовать rand для генерации равномерно распределенных случайных чисел. Вот несколько простых примеров:

Numpy в Python:

import numpy as np
sample = np.random.rand(2)
print(sample)

Результат:

[0.70573498 0.8595017 ]

Матлаб:

sample = rand(1, 2)

Результат:

ans =

   0.5390   0.7686

Вышеупомянутые примеры относятся к равномерно распределенным случайным числам. Мы можем генерировать случайные числа, которые соответствуют стандартному нормальному распределению:

  • Numpy в Python: np.random.randn
  • Matlab: randn

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

Например, следующий код Python:

import numpy as np
np.random.seed(10)
sample = np.random.rand(2)
print(sample)

произвел бы эти случайные числа:

[0.77132064 0.02075195]

В Matlab:

rng(10);
sample = rand(1, 2)

у нас есть следующий вывод:

sample =
0.7713    0.0208

Сравнение функций Rand в Numpy и Matlab

И в Numpy, и в Matlab они могут обрабатывать вычисления разных массивов:

  • 1-D массив (одномерный массив) относится к вектору.
  • Двумерный массив (двумерный массив) относится к матрице.
  • Трехмерный массив (трехмерный массив) относится к тензору третьего порядка.
  • ……
  • n -D массив (n -мерный массив) относится к тензору n -го порядка.

Далее мы попытаемся сгенерировать равномерно распределенные случайные числа в Numpy и Matlab соответственно. Мы также попытаемся сгенерировать одинаковые случайные числа в Numpy и Matlab.

Создание одномерного массива

Чтобы получить одинаковые равномерно распределенные случайные числа в Numpy и Matlab, мы устанавливаем размер вектора равным 4, а случайное начальное число равным 10. Давайте попробуем!

Numpy:

import numpy as np
np.random.seed(10)
sample = np.random.rand(4)
print(sample)

Беги, у нас есть

[0.77132064 0.02075195 0.63364823 0.74880388]

Matlab:

rng(10);
sample = rand(1, 4)

Беги, у нас есть

sample =
    0.7713    0.0208    0.6336    0.7488

Очевидно, что оба двух сгенерированных случайных вектора одинаковы.

Создание двумерного массива

Сначала мы устанавливаем размер матрицы как 2 на 3, а случайное начальное число - как 10.

Numpy:

import numpy as np
np.random.seed(10)
sample = np.random.rand(2, 3)
print(sample)

Беги, у нас есть

[[0.77132064 0.02075195 0.63364823]
 [0.74880388 0.49850701 0.22479665]]

Matlab:

rng(10);
sample = rand(2, 3)

Беги, у нас есть

sample =
    0.7713    0.6336    0.4985
    0.0208    0.7488    0.2248

Сгенерированные равномерно распределенные случайные матрицы такие же.

Создание трехмерного массива

Сначала мы устанавливаем размер матрицы как 2 на 3 на 2, а случайное начальное число - как 10.

Numpy:

import numpy as np
np.random.seed(10)
sample = np.random.rand(2, 3, 2)
print(‘sample[:, :, 0] = ‘)
print()
print(sample[:, :, 0])
print()
print(‘sample[:, :, 1] = ‘)
print()
print(sample[:, :, 1])

Беги, у нас есть

sample[:, :, 0] = 

[[0.77132064 0.63364823 0.49850701]
 [0.19806286 0.16911084 0.68535982]]

sample[:, :, 1] = 

[[0.02075195 0.74880388 0.22479665]
 [0.76053071 0.08833981 0.95339335]]

Matlab:

rng(10);
sample = rand(2, 3, 2)

Беги, у нас есть

sample(:,:,1) =
    0.7713    0.6336    0.4985
    0.0208    0.7488    0.2248
sample(:,:,2) =
    0.1981    0.1691    0.6854
    0.7605    0.0883    0.9534

Сгенерированные равномерно-распределенные случайные тензоры такие же.

Генерация случайных чисел с нормальным распределением в Numpy и Matlab

Выше Numpy и Matlab могут генерировать одинаковые равномерно распределенные случайные числа, если мы используем одно и то же случайное начальное число. К сожалению, поскольку Numpy и Matlab используют разные преобразования для генерации выборок из стандартного нормального распределения, поэтому нам нужно использовать одно и то же преобразование как в Numpy, так и в Matlab.

На практике все еще можно воспроизвести вывод randn () Matlab так же, как Numpy.

Numpy:

import numpy as np
from scipy.stats import norm
np.random.seed(10)
sample = norm.ppf(np.random.rand(2, 3))
print(sample)

Беги, у нас есть

[[ 0.74320312 -2.03846052  0.34153145]
 [ 0.67073049 -0.00374237 -0.75609325]]

Матлаб:

rng(10);
sample = norminv(rand(2, 3), 0, 1)

Беги, у нас есть

sample =
    0.7432    0.3415   -0.0037
   -2.0385    0.6707   -0.7561

Сгенерированные случайные матрицы с нормальным распределением такие же.

использованная литература

[1] Numpy в Википедии: https://en.wikipedia.org/wiki/NumPy

[2] Matlab в Википедии: https://en.wikipedia.org/wiki/MATLAB

[3] Логотип Numpy взят с сайта https://commons.wikimedia.org/wiki/File:NumPy_logo_2020.svg

[4] Логотип Matlab взят с сайта https://www.google.com/url?esrc=s&q=&rct=j&sa=U&url=https://1000logos.net/matlab-logo/&ved=2ahUKEwj24b7C7bvzAhUKoXIEHci3AdQQr4kDegdegKQQr4kDegDegQQQr4kDegDegQQR4kDegDeg.

[5] Воспроизведение случайных чисел в Matlab и Python / NumPy. Сайт GitHub: https://github.com/jonasrauber/randn-matlab-python

[6] Можно ли воспроизвести randn () из MATLAB с помощью NumPy? Https://stackoverflow.com/questions/3722138/is-it-possible-to-reproduce-randn-of-matlab-with-numpy

[7] Сравнение кода Matlab и Numpy, использующего генерацию случайных чисел. Https://stackoverflow.com/questions/18486241/comparing-matlab-and-numpy-code-that-uses-random-number-generation