Я хотел бы выполнить эквивалент следующего кода MATLAB, используя NumPy: repmat([1; 1], [1 1 1])
. Как бы это сделать?
Что эквивалентно MATLAB repmat в NumPy
Ответ 1
Здесь намного лучше (официальный) ссылка 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]]])
Ответ 2
Обратите внимание, что некоторые из причин, по которым вам нужно использовать MATLAB repmat, позаботятся механизмом NumPy broadcasting, который позволяет вам для выполнения различных типов математики с массивами аналогичной формы. Так что если бы у вас был, скажем, массив размером 1600x1400x3, представляющий трехцветное изображение, вы могли бы (по-разному) умножить его на [1.0 0.25 0.25]
, чтобы уменьшить количество зеленого и синего на каждом пикселе. См. Ссылку выше для получения дополнительной информации.
Ответ 3
См. NumPy для пользователей Matlab.
Matlab:
repmat(a, 2, 3)
Numpy:
numpy.kron(numpy.ones((2,3)), a)
Ответ 4
Знайте как tile
, так и repeat
.
x = numpy.arange(5)
print numpy.tile(x, 2)
print x.repeat(2)
Ответ 5
Вот как я понял это из-за того, что он возился. Благодарим вас за исправление и надеюсь, что это поможет.
Скажем, у вас есть матрица 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-го уровня. Там нужно быть осторожным, и получение тех же результатов с двумя языками потребует большей предварительной подготовки.
Я знаю, что это рассуждение вполне может быть общим, но я мог бы разобраться только в этом. Надеюсь, это пригласит других стипендиатов, чтобы проверить его на жестком уровне.