Відповіді:
Ось набагато кращий (офіційний) NumPy для користувачів Matlab - я боюсь, що той, який є математичним, дуже застарів.
Нульовий еквівалент repmat(a, m, n)дорівнюєtile(a, (m, n)) .
Це працює з декількома розмірами і дає схожий результат на матлаб. (Numpy дає 3d-вихідний масив, як ви очікували - matlab чомусь дає 2d вихід - але вміст той самий).
Матлаб:
>> repmat([1;1],[1,1,1])
ans =
1
1
Пітон:
In [46]: a = np.array([[1],[1]])
In [47]: np.tile(a, [1,1,1])
Out[47]:
array([[[1],
[1]]])
aрозмірності аргументу плитки, попередньо додаючи нові осі за необхідності. Матлаб, здається, працює інакше. Точно так само з 4d плиткою вам знадобляться новинки два рази ... так, np.tile(a[:,newaxis,newaxis],[1,2,3,4]) = size(repmat(a,[1 2 3 4]))як потрібно ...
Зауважте, що з деяких причин, які вам знадобиться використовувати реплет MATLAB, опікується механізм мовлення NumPy , який дозволяє робити різні типи математики з масивами подібної форми. Отже, якби у вас, скажімо, був масив розміром 1600x1400x3, що представляє 3-кольорове зображення, ви могли б (елементарно) помножити його [1.0 0.25 0.25]на зменшення кількості зеленого та синього на кожен піксель. Для отримання додаткової інформації див. Вищенаведене посилання.
bsxfun.
Див. NumPy для користувачів Matlab .
Матлаб:
repmat(a, 2, 3)
Numpy:
numpy.kron(numpy.ones((2,3)), a)
Matlib in Numpy ( numpy.matlib.repmat () ):
numpy.matlib.repmat(a, 2, 3)
Ось як я це зрозумів із трохи хитрування. Раді виправитись і сподіваюся, що це допоможе.
Скажімо, у вас є матриця M з 2х3 елементів. Очевидно, це має два виміри.
Я не міг бачити різниці між Matlab та Python, просячи маніпулювати вхідною матрицею за розмірами, які матриця вже має. Таким чином, дві команди
repmat(M,m,n) % matlab
np.tile(M,(m,n)) # python
дійсно еквівалентні для матриці 2 рангу (два виміри).
Питання виходять контрінтуїтивними, коли ви запитуєте про повторення / накладання плит на більше розмірів, ніж вхідна матриця. Повертаючись до матриці M другого рангу та форми 2x3, достатньо подивитися, що відбувається з розміром / формою вихідної матриці. Скажімо, послідовність маніпуляцій зараз 1,1,2.
У Матлабі
> 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, що не було видно з масивами ran-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]])