Сопоставление numpy rand ndarrays с MATLAB

Я пытаюсь сопоставить случайно сгенерированные ndarrays из numpy с MATLAB.

import numpy as np

# Set the seed for NumPy's random generator
np.random.seed(42) #Mersenne Twister is default
    
# Generate complex random numbers
a = 16
b = 4
c = 10
x_py = np.random.rand(a, b, c) + 1j * np.random.rand(a, b, c)

Вот версия MATLAB:

% Set the seed for MATLAB's random generator
rng(42, 'twister')  % Use the Mersenne Twister algorithm

% Generate complex random numbers
a = 16;
b = 4;
c = 10;
x_ml = rand([a, b, c], 'like', 1i);

Теперь, хотя тип начального числа и генератора совпадают, состояния не совпадают, поэтому мне не удалось сопоставить x_py и x_ml.

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

Во-первых, один использует порядок C, а другой — F. Вам следует изолировать проблемы dtyoe и shape от получения одного и того же генератора.

Mad Physicist 30.04.2024 17:46
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
1
2
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Этот вопрос очень похож на другой, но с тем дополнением, что здесь мы имеем дело с 3D-массивами и комплексными числами.

Согласно другим вопросам и ответам, MATLAB заполняет массивы по столбцам, а Python заполняет их по строкам. Вам нужно транспонировать результат одного, чтобы он соответствовал другому. Для 3D-массивов порядок индексации в Python — [z,y,x], в MATLAB — [y,x,z]. Однако порядок хранения обратный: в MATLAB индекс y (первый) — это индекс, который индексирует смежные адреса памяти, тогда как индекс x (последний) в Python делает это. Поэтому нам нужно определить массивы с разным порядком размеров, а затем переставить размеры, чтобы они совпадали.

Другая проблема заключается в том, что в Python np.random.rand(a, b, c) + 1j * np.random.rand(a, b, c) сначала генерирует все действительные значения, а затем все мнимые значения. В MATLAB rand([a, b, c], 'like', 1i) будет генерировать реальное значение, затем мнимое, затем действительное и т. д.

Собрав все это вместе,

x_ml = permute(rand([c, b, a]) + 1j * rand([c, b, a]), [2,1,3])

создает тот же массив, что и x_py в вопросе.

Другие вопросы по теме