Вы добавили транспонирование в C
, которого нет в коде MATLAB.
Если вы хотите сохранить точно такой же формат данных, введите конечный одноэлементный размер в A
. В MATLAB конечные неявные синглтоны, в numpy ведущие неявные синглтоны:
>>> D = A[...,None] * C.squeeze()
>>> D
array([[[1.e+02, 1.e+00],
[2.e+01, 2.e-01],
[3.e+00, 3.e-02]],
[[4.e+02, 4.e+00],
[5.e+01, 5.e-01],
[6.e+00, 6.e-02]],
[[7.e+02, 7.e+00],
[8.e+01, 8.e-01],
[9.e+00, 9.e-02]]])
Здесь A[..., None]
имеет форму (3, 3, 1)
, а C.squeeze()
просто отменяет это избыточное ведущее одноэлементное измерение и придает ему форму (3,2)
Они передают в форму (3, 3, 2)
. MATLAB и numpy по-разному интерпретируют многомерные массивы, что объясняет, почему repr
выше соответствует трем массивам формы (3,2)
, тогда как MATLAB показывает два массива формы (3,3
). Но на самом деле это тот же массив:
>>> D[..., 0]
array([[100., 20., 3.],
[400., 50., 6.],
[700., 80., 9.]])
>>> D[..., 1]
array([[1. , 0.2 , 0.03],
[4. , 0.5 , 0.06],
[7. , 0.8 , 0.09]])
Обратите внимание, что если вы сохраняете порядок MATLAB в своем коде numpy, возможно, вы захотите использовать разметку fortran в своих массивах, иначе у вас будут "быстрые" оси в неоптимальных местах кода numpy.