Что эквивалентно repmat MATLAB в NumPy - PullRequest
90 голосов
/ 12 ноября 2009

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

Ответы [ 7 ]

92 голосов
/ 12 ноября 2009

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

Числовой эквивалент 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]]])
17 голосов
/ 12 ноября 2009

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

9 голосов
/ 12 ноября 2009

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

Matlab:

repmat(a, 2, 3)

Numpy:

numpy.kron(numpy.ones((2,3)), a)
5 голосов
/ 20 января 2010

Знаю и tile и repeat.

x = numpy.arange(5)
print numpy.tile(x, 2)
print x.repeat(2)
4 голосов
/ 27 марта 2016

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

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


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

repmat(M,m,n) % matlab

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

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


Ситуация становится нелогичной, когда вы запрашиваете повторение / разбиение мозаики на большее количество измерений, чем имеет входная матрица. Возвращаясь к матрице М ранга два и формы 2х3, достаточно взглянуть на то, что происходит с размером / формой выходной матрицы. Скажем, последовательность манипуляций теперь 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, когда кто-то использует продукт Kronecker из

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


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

0 голосов
/ 26 октября 2018

numpy.matlib имеет функцию repmat с интерфейсом, аналогичным функции matlab

from numpy.matlib import repmat
repmat( np.array([[1],[1]]) , 1, 1)
0 голосов
/ 26 июля 2018
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]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...