6 ответов:
вот намного лучше (официальный)NumPy для пользователей Matlab link-я боюсь, что mathesaurus один довольно устарел.
numpy эквивалент
repmat(a, m, n)иtile(a, (m, n)).это работает с несколькими измерениями и дает аналогичный результат для matlab. (Numpy дает 3D-выходной массив, как и следовало ожидать-matlab по какой - то причине дает 2d-выход, но содержимое одинаковый.)
Matlab:
>> repmat([1;1],[1,1,1]) ans = 1 1Python:
In [46]: a = np.array([[1],[1]]) In [47]: np.tile(a, [1,1,1]) Out[47]: array([[[1], [1]]])
обратите внимание, что некоторые из причин, вы должны были бы использовать repmat Матлаб не заботятся и NumPy это вещания механизм, который позволяет делать различные типы математики с массивами одинаковой формы. Поэтому, если бы у вас был, скажем, массив 1600x1400x3, представляющий 3-цветное изображение, вы могли бы (элементарно) умножить его на
[1.0 0.25 0.25]уменьшить количество зеленого и синего в каждом пикселе. См. ссылку выше для получения дополнительной информации.
посмотреть NumPy для пользователей Matlab.
Matlab:
repmat(a, 2, 3)Numpy:
numpy.kron(numpy.ones((2,3)), a)
вот как я понял это из немного возиться. Рад быть исправленным и надеюсь, что это поможет.
скажем, у вас есть матрица M 2х3 элементов. Это имеет два измерения, очевидно.
Я не видел разницы между 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 нужно убедиться, что входная матрица имеет столько измерений, сколько элементов в последовательности. Это делается, например, путем небольшой предварительной подготовки и создания связанного объекта NN = 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. Там нужно быть осторожным, и получение тех же результатов с двумя языками потребует более предварительной подготовки.
Я знаю, что это рассуждение вполне может быть не общим, но я мог бы решить это только до сих пор. Надеюсь, это приглашает других стипендиатов поставьте его на более трудное испытание.
import numpy as np np.repeat(['a','b'], [2,5]) >>> array(['a', 'a', 'b', 'b', 'b', 'b', 'b'], dtype='<U1') np.repeat([1,2], [2,5]) >>> array([1, 1, 2, 2, 2, 2, 2]) np.repeat(np.array([1,2]), [3]).reshape(2,3) >>> array([[1, 1, 1], [2, 2, 2]]) np.repeat(np.array([1,2]), [2,4]).reshape(3,2) >>> array([[1, 1], [2, 2], [2, 2]]) np.repeat(np.matrix('1 2; 3 4'), [2]).reshape(4,2) >>> matrix([[1, 1], [2, 2], [3, 3], [4, 4]])
Comments