Что эквивалентно repmat MATLAB в NumPy

72

Я хотел бы выполнить эквивалент следующего кода MATLAB, используя NumPy: repmat([1; 1], [1 1 1]). Как бы это сделать?

Теги:
numpy

5 ответов

78
Лучший ответ

Здесь намного лучше (официальный) ссылка NumPy для пользователей Matlab - я боюсь, что матезавр один из них устарел.

Нулевой эквивалент repmat(a, m, n) tile(a, (m, n)).

Это работает с несколькими измерениями и дает аналогичный результат для matlab. (Numpy дает трехмерный выходной массив, как и следовало ожидать - Matlab по какой-то причине дает 2d-вывод, но контент тот же).

Matlab:

>> repmat([1;1],[1,1,1])

ans =
     1
     1

Python:

In [46]: a = np.array([[1],[1]])
In [47]: np.tile(a, [1,1,1])
Out[47]: 
array([[[1],
        [1]]])
  • 1
    когда я пытаюсь указать размер (repmat ([1; 1], [1,1,2])), он получит ans = 2 1 2 [в matlab], но в python np.tile (a, [1,1,2]) . получить его (1, 2, 2), я хочу, чтобы numpy дать результат, такой же, как Matlab
  • 2
    np.tile (a [:, np.newaxis], [1,1,2]) - он дает то же самое. Проблема плитка способствует размерности плитки аргумента, предваряя новую ось по мере необходимости. a Матлаб, похоже, работает по-другому. Точно так же, с 4-мерным тайлингом вам понадобится newaxis дважды ... так что np.tile(a[:,newaxis,newaxis],[1,2,3,4]) = size(repmat(a,[1 2 3 4])) мере необходимости ...
14

Обратите внимание, что некоторые из причин, по которым вам нужно использовать MATLAB repmat, позаботятся механизмом NumPy broadcasting, который позволяет вам для выполнения различных типов математики с массивами аналогичной формы. Так что если бы у вас был, скажем, массив размером 1600x1400x3, представляющий трехцветное изображение, вы могли бы (по-разному) умножить его на [1.0 0.25 0.25], чтобы уменьшить количество зеленого и синего на каждом пикселе. См. Ссылку выше для получения дополнительной информации.

  • 0
    спасибо кватфорд :)
  • 1
    Не то чтобы Matlab мог делать эту трансляцию, если вы используете bsxfun .
8

См. NumPy для пользователей Matlab.

Matlab:

repmat(a, 2, 3)

Numpy:

numpy.kron(numpy.ones((2,3)), a)
  • 5
    Я не думаю, что ссылка на mathesaurus очень хорошая. В официальной документации есть страница Numpy For Matlab Users, которая является более полной и актуальной: scipy.org/NumPy_for_Matlab_Users
  • 0
    спасибо, rcs, я попробую
Показать ещё 2 комментария
4

Знайте как tile, так и repeat.

x = numpy.arange(5)
print numpy.tile(x, 2)
print x.repeat(2)
3

Вот как я понял это из-за того, что он возился. Благодарим вас за исправление и надеюсь, что это поможет.

Скажем, у вас есть матрица M из 2x3 элементов. Очевидно, это имеет два измерения.


Я не вижу разницы между Matlab и Python, прося манипулировать входной матрицей по размерам, которые уже имеет матрица. Таким образом, две команды

repmat(M,m,n) % matlab

np.tile(M,(m,n)) # python

действительно эквивалентны для матрицы ранга 2 (два измерения).


Вопросы противоречат интуиции, когда вы запрашиваете повторение/разбиение на несколько измерений, чем матрица ввода. Возвращаясь к матрице M второго ранга и формы 2x3, достаточно взглянуть на то, что происходит с размером/формой выходной матрицы. Скажем, что последовательность манипуляций теперь 1,1,2.

В Matlab

> size(repmat(M,1,1,2))
ans =

    2   3   2

он скопировал первые два измерения (строки и столбцы) входной матрицы и повторил это один раз в новое третье измерение (копируется дважды, то есть). Верно для именования repmat для повторной матрицы.

В Python

>>> np.tile(M,(1,1,2)).shape
(1, 2, 6)

он применил другую процедуру, поскольку, я полагаю, последовательность (1,1,2) читается иначе, чем в Matlab. Число копий в направлении столбцов, строк и размерности вне плоскости читается справа налево. Полученный объект имеет другую форму от Matlab. Уже нельзя утверждать, что repmat и tile являются эквивалентными инструкциями.


Чтобы заставить tile вести себя как repmat, в Python нужно убедиться, что входная матрица имеет столько же размеров, сколько и элементы в последовательности. Это делается, например, небольшим предварительным условием и созданием связанного объекта N

N = M[:,:,np.newaxis]

Затем на стороне ввода есть N.shape = (2,3,1), а не M.shape = (2,3), а на стороне выхода

>>> np.tile(N,(1,1,2)).shape
(2, 3, 2)

который был ответом size(repmat(M,1,1,2)). Я предполагаю, что это связано с тем, что мы руководствовались Python, чтобы добавить третье измерение справа от (2,3), а не влево, так что Python разрабатывает последовательность (1,1,2), как это было предусмотрено в Matlab способ его чтения.

Элемент в [:,:,0] в ответе Python для N будет содержать те же значения, что и элемент (:,:,1) ответ Matlab для M.


Наконец, я не могу найти эквивалент для repmat, когда вы используете продукт Кронекера из

>>> np.kron(np.ones((1,1,2)),M).shape
(1, 2, 6)

если я не предусмотрел условие M в N, как указано выше. Поэтому я бы сказал, что наиболее общий способ двигаться дальше - использовать способы np.newaxis.


Игра становится сложнее, если мы рассмотрим матрицу L ранга 3 (три измерения) и простой случай добавления новых измерений в выходной матрице. Эти две, казалось бы, эквивалентные инструкции не приведут к тем же результатам

repmat(L,p,q,r) % matlab

np.tile(L,(p,q,r)) # python

потому что строки, столбцы, неплановые направления являются (p, q, r) в Matlab и (q, r, p) в Python, которые не были видны в рангах 2-го уровня. Там нужно быть осторожным, и получение тех же результатов с двумя языками потребует большей предварительной подготовки.


Я знаю, что это рассуждение вполне может быть общим, но я мог бы разобраться только в этом. Надеюсь, это пригласит других стипендиатов, чтобы проверить его на жестком уровне.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню