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



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

811   6  

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
     1

Python:

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)

знать tile и repeat.

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

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

скажем, у вас есть матрица 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 нужно убедиться, что входная матрица имеет столько измерений, сколько элементов в последовательности. Это делается, например, путем небольшой предварительной подготовки и создания связанного объекта 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. Там нужно быть осторожным, и получение тех же результатов с двумя языками потребует более предварительной подготовки.


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

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

    Ничего не найдено.