Создайте аналогичный матричный объект в Matlab и Python

В целях сравнения я хочу создать объект, который будет иметь одинаковую форму и свойства индексации в Matlab и Python (numpy). Допустим, на стороне Matlab объект будет:

arr_matlab = cat(4, ...
    cat(3, ...
        [  1,   2;
           3,   4;
           5,   6], ...
        [  7,   8;
           9,  10;
          11,  12], ...
        [ 13,  14;
          15,  16;
          17,  18], ...
        [ 20,  21;
          22,  23;
          24,  25]), ...
    cat(3, ...
        [ 26,  27;
          28,  29;
          30,  31], ...
        [ 32,  33;
          34,  35;
          36,  37], ...
        [ 38,  39;
          40,  41;
          42,  43], ...
        [ 44,  45;
          46,  47;
          48,  49]), ...
    cat(3, ...
        [ 50,  51;
          52,  53;
          54,  55], ...
        [ 56,  57;
          58,  59;
          60,  61], ...
        [ 62,  63;
          64,  65;
          66,  67], ...
        [ 68,  69;
          70,  71;
          72,  73]), ...
    cat(3, ...
        [ 74,  75;
          76,  77;
          78,  79], ...
        [ 80,  81;
          82,  83;
          84,  85], ...
        [ 86,  87;
          88,  89;
          90,  91], ...
        [ 92,  93;
          94,  95;
          96,  97]), ...
    cat(3, ...
        [ 98,  99;
         100, 101;
         102, 103], ...
        [104, 105;
         106, 107;
         108, 109], ...
        [110, 111;
         112, 113;
         114, 115], ...
        [116, 117;
         118, 119;
         120, 121]));
K>> size(arr_matlab)

ans =

     3     2     4     5

K>> arr_matlab(1, 2, 1 ,1)

ans =

     2

size(arr_matlab) должен быть идентичен arr_python.shape, и индексирование должно давать тот же результат (например, тот же результат для arr_python[0,1,0,0] и arr_matlab(1,2,1,1)). На данный момент я не могу этого сделать.

data = np.array([
     ...:     1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 25,
     ...:     26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
     ...:     50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
     ...:     74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97,
     ...:     98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121
     ...: ])
     ...: 
     ...: # Reshape to 3x2x4x5
     ...: arr_python = data.reshape((3, 2, 4, 5), order='F')
In [138]: arr_python.shape
Out[138]: (3, 2, 4, 5)
 arr_python[0,1,0,0]
Out[143]: 4
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Это то, чего вы пытаетесь достичь в Python и MatLab:

МатЛаб

arr_matlab = reshape(1:120, [3, 2, 4, 5]);
L = size(arr_matlab);
disp(L);
disp(arr_matlab(1, 2, 1, 1));

Принты

3   2   4   5

4

Питон

import numpy as np

data = np.arange(1, 120 + 1)
arr_python = data.reshape((3, 2, 4, 5), order='F')
print(arr_python.shape)
print(arr_python[0, 1, 0, 0])

Принты

(3, 2, 4, 5)
4

Комментарии:

  • Обратите внимание, что конечный диапазон Python не является всеобъемлющим.

  • В версии Python вы можете упростить data = np.array(list(range(1, 120 + 1))) до data = np.arange(1, 120 + 1).

  • Порядок F в Python обратный порядку C. Но это не соответствует порядку MATLAB. Если порядок C в Python индексируется как a,b,c,d, то порядок в MATLAB равен c,d,b,a. Это странно, я знаю. Протестируйте свой код, выполняя более одной операции индексирования, вы можете обнаружить несоответствия. — Крис Луенго

  • Хорошо, мой комментарий выше относится к интерпретации осей в MATLAB и Python, а не к порядку хранения, о чем этот вопрос. Я проверил индексацию этого решения, и она совпадает. — Крис Луенго

именно то, что я искал! Спасибо.

servoz 05.07.2024 21:51

Порядок F в Python обратный порядку C. Но это не соответствует порядку MATLAB. Если порядок C в Python индексируется как a,b,c,d, то порядок в MATLAB — c,d,b,a. Это странно, я знаю. Протестируйте свой код, выполняя более одной операции индексирования, вы можете обнаружить несоответствия.

Cris Luengo 08.07.2024 17:34

Хорошо, мой комментарий выше относится к интерпретации осей в MATLAB и Python, а не к порядку хранения, о чем этот вопрос. Я проверил индексацию этого решения, и она совпадает.

Cris Luengo 08.07.2024 18:12

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