Преобразование MATLAB в Python: векторы, массивы, элементы индекса - PullRequest
0 голосов
/ 04 декабря 2018

Добрый день всем!В настоящее время я конвертирую проект MATLAB в Python 2.7.Я пытаюсь преобразовать строку

h =  [  im(:,2:cols)  zeros(rows,1) ] - [  zeros(rows,1)  im(:,1:cols-1)  ];

Когда я пытаюсь преобразовать ее

h = np.concatenate((im[1,range(2,cols)], np.zeros((rows, 1)))) -  
np.concatenate((np.zeros((rows, 1)),im[1,range(2,cols - 1)] ))

IDLE возвращает различные ошибки, такие как

ValueError: all the input arrays must have same number of dimensions

Я очень новичокв Python, и я был бы признателен, если бы вы предложили другие методы.Спасибо вам большое!Вот функция, которую я пытаюсь преобразовать.

function [gradient, or] = canny(im, sigma, scaling, vert, horz)
xscaling = vert; yscaling = horz;
hsize = [6*sigma+1, 6*sigma+1];   % The filter size.

gaussian = fspecial('gaussian',hsize,sigma);
im = filter2(gaussian,im);        % Smoothed image.

im = imresize(im, scaling, 'AntiAliasing',false);

[rows, cols] = size(im);

h =  [  im(:,2:cols)  zeros(rows,1) ] - [  zeros(rows,1)  im(:,1:cols-1)  ];

И я бы также попросил эквивалент оператора ':', который используется главным образом в индексах и массивах в Python.Есть ли какой-нибудь эквивалент для оператора:

Python-преобразованный код, который я начал:

def canny(im=None, sigma=None, scaling=None, vert=None, horz=None):

xscaling = vert
yscaling = horz

hsize = (6 * sigma + 1), (6 * sigma + 1) # The filter size.

gaussian = gauss2D(hsize, sigma)
im = filter2(gaussian, im) # Smoothed image.
print("This is im")
print(im)
print("This is hsize")
print(hsize)
print("This is scaling")
print(scaling)
#scaling = 0.4
#scaling = tuple(scaling)

im = cv2.resize(im,None, fx=scaling, fy=scaling )  
[rows, cols] = np.shape(im)

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

С помощью np.zeros ((Nrows, 1)) вы создаете 2D-массив, содержащий Nrows 1D-массивы с 1 элементом.Затем с помощью im [1,2: cols] вы получаете одномерный массив элементов cols-2.Вы должны изменить np.zeros ((строки, 1)) на np.zeros (строки).

Более того, во втором np.concatenate, когда вы получаете подмассив из 'im', вы должны взять то же самоеколичество элементов, чем в первом сцеплении.Обратите внимание, что вы берете на один элемент меньше: range (2, cols) VS range (2, cols-1).

0 голосов
/ 04 декабря 2018

Скажите, что ваши данные находятся в списке списков.Попробуйте это:

a = [[2, 9, 4], [7, 5, 3], [6, 1, 8]]
im = np.array(a, dtype=float)
rows = 3
cols = 3
h = (np.hstack([im[:, 1:cols], np.zeros((rows, 1))])
   - np.hstack([np.zeros((rows, 1)), im[:, :cols-1]]))

Эквивалент MATLAB horzcat (то есть [A B]) равен np.hstack и эквивалент vertcat ([A; B]) равно np.vstack .

Индексирование массива в numpy очень близко к MATLAB, за исключением того, что индексы начинаются с 0 в numpy, идиапазон p: q означает «от p до q-1».

Кроме того, порядок хранения массивов по умолчанию составляет row-major , и вы можете использовать порядок по столбцам, если выхочу (см. это ).В MATLAB массивы хранятся в основном порядке столбцов.Чтобы проверить в Python, наберите, например, np.isfortran(im).Если он возвращает true, массив имеет тот же порядок, что и MATLAB (порядок Fortran), в противном случае он является мажор-строкой (порядок C).Это важно, когда вы хотите оптимизировать циклы или когда вы передаете массив в подпрограмму C или Fortran.

В идеале, попробуйте поместить все в массив np.array как можно скорее, и не используйте списки(они занимают гораздо больше места, а обработка выполняется намного медленнее).Есть также некоторые причуды: например, 1.0 / 0.0 выдает исключение, но np.float64(1.0) / np.float64(0.0) возвращает inf, как в MATLAB.


Другой пример из комментариев:

d1 = [ im(2:rows,2:cols) zeros(rows-1,1); zeros(1,cols) ] - ...
     [ zeros(1,cols); zeros(rows-1,1) im(1:rows-1,1:cols-1) ];

d2 = [ zeros(1,cols); im(1:rows-1,2:cols) zeros(rows-1,1); ] - ... 
     [ zeros(rows-1,1) im(2:rows,1:cols-1); zeros(1,cols) ];

Для этого вместо np.vstack и np.hstack можно использовать np.block .

im = np.ones((10, 15))
rows, cols = im.shape

d1 = (np.block([[im[1:rows, 1:cols], np.zeros((rows-1, 1))],
                [np.zeros((1, cols))]]) -
      np.block([[np.zeros((1, cols))],
                [np.zeros((rows-1, 1)), im[:rows-1, :cols-1]]]))

d2 = (np.block([[np.zeros((1, cols))],
                [im[:rows-1, 1:cols], np.zeros((rows-1, 1))]]) -
      np.block([[np.zeros((rows-1, 1)), im[1:rows, :cols-1]],
                [np.zeros((1, cols))]]))
...