2016-01-04 2 views
2

Я новичок в python и получил код python для перевода в Matlab для моей работы. У меня есть конкретная проблема:Перевод python/numpy "A.argmin (axis = -1)" в эквивалентное выражение matlab

У меня есть матрица размером, например (строки/столбцы/3-й тусклый) = (3/4/2).

A = array([[[1, 56, 0, 6],[5, 9, 10, 3],[50, 51, 59, 64]],[[2, 6, 4, 3],[10, 80, 53, 6],[12, 5, 36, 15]]]) 

Для этой матрицы (и другие) Я дал функцию

B = A.argmin(axis=-1) 

, который осуществляет поиск индекса минимума в каждом ряду. (numpy.argmin Manual)

В находится в этом случае:

B = array([[2, 3, 0],[0, 3, 1]]) 

и размера (строк/столбцов) = (2/3).

Моя АМЫ конвертировать именно это в Matlab-версию, так что я получаю именно эту матрицу, но в Matlab ([Manual Min Matlab] [2])

[~,B] = min(A,[],2) 

дает мне матрицу size (row/colums/3rd dim) = (3/1/2). Matlab Output

Индексы минимума в каждой строке одинаковы, если учитывать, что python начинает индексировать в 0 и matlab в 1. Проблема заключается в порядке матрицы.

Как я могу получить размер минимальной суммы каждой строки в точном порядке, так как python делает это в matlab?

Я пробовал много с перестановкой и vertcat, но это не сработало и, в конце концов, оно должно работать для действительно больших матриц.

Я был бы рад, если бы кто-то мог мне помочь. Спасибо заранее!

+0

Добро пожаловать в переполнение стека! Пожалуйста, объясните немного более четко, как результаты отличаются. Кроме того, рассмотрите возможность добавления выходов в качестве кода вместо изображений. –

ответ

5

Единственная проблема заключается в том, что вы принимаете неправильное измерение в MATLAB. axis=-1 в NumPy соответствует последнему измерению (так что я не думаю, что это выглядит по каждой строке как вы заявили в вопросе), т.е. min(A,[],3):

A(1,:,:)=[1 56 0 6; 5 9 10 3; 50 51 59 64]; 
A(2,:,:)=[2 6 4 3; 10, 80, 53, 6; 12, 5, 36, 15]; 
[~,B] = min(A,[],3); 

Результирующее в:

B = 

    3  4  1 
    1  4  2 

который, как вы сказали, соответствует матрице индекса NumPy

In [409]: B = A.argmin(axis=-1) 

In [410]: B 
Out[410]: 
array([[2, 3, 0], 
     [0, 3, 1]]) 

Обратите внимание, что если бы вы использовали min(A,[],2) в MATLAB, результирующая матрица была бы size[2,1,4]. Чтобы избавиться от размера синглтона, вам понадобилось бы использовать squeeze(B), чтобы получить 2-мерный массив.

Также обратите внимание, что вы, возможно, испортили оригинальную матрицу. Ваш numpy ndarray имеет shape(2,3,4), поэтому я создал копию MATLAB, назначив матрицы 3x4A(1,:,:) и A(2,:,:).Я нахожу это вероятным источником путаницы, поскольку вы утверждаете, что закончили с матрицей размером [2,1,3] (а не [2,1,4]), но тогда ваши последние два измерения должны были быть переведены в MATLAB.

+0

Спасибо большое! Одна вещь, которую я не понимаю при переключении python и MATLAB - это то, как вы строите матрицы. Я понимаю это так: В numpy свойство shape дает мне (z, x, y), то есть 3-е измерение и строки (x) и столбцы (y). В Matlab я думал, что у меня есть обозначение A (x, y, z), поэтому создание матрицы A, как показано ниже, не использует A (1,:, :) и A (2,:, :), но A (: ,:, 1) и A (:,:, 2). Я ошибаюсь? Мой Matlab-вывод с использованием A (z, x, y) не является той же матрицей, что и A выше ... – Maren

+0

@Maren Я не думаю, что понимаю ваш подход. У вас есть массивы с 3 индексами в обоих случаях. Индексам нет неотъемлемого значения. Одним из отличий может быть тот порядок, в котором каждый язык * выделяет память * для элементов массива, например, в matlab 'A (:,:, 1)' будет непрерывным куском памяти, а 'A (1,:,:) 'не будет. Но я думаю, что по определению вы должны получить тот же массив, если 'shape' в numpy совпадает с' size' в MATLAB. Не могли бы вы указать мне на какой-то источник, откуда происходит переход вашего индекса? –

+0

@ Индекс Andras в MATLAB и Python отличается. MATLAB использует соглашение о заказе индекса Fortran, а numpy (по умолчанию) использует соглашение о заказе индекса C. Эти соглашения противоположны, поэтому 'A (i, j, k)' в MATLAB эквивалентно 'A [k, j, i]' в numpy (по умолчанию). Вы можете определить отдельные массивы numpy, чтобы быть в порядке Fortran, но если вы не определяете порядок заказа, то используется порядок. MATLAB поддерживает только порядок Fortran. – TheBlackCat

Смежные вопросы