Скажите, что ваши данные находятся в списке списков.Попробуйте это:
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))]]))