MATLAB repmatının NumPy'deki karşılığı nedir


103

Ben numpy kullanarak aşağıdaki MATLAB kod eşdeğer yürütmek istiyoruz: repmat([1; 1], [1 1 1]). Bunu nasıl başarabilirim?

Yanıtlar:


103

İşte Matlab Kullanıcıları için çok daha iyi (resmi) bir NumPy bağlantısı - Korkarım matematik sözlüğü oldukça güncel değil.

Arasında numpy eşdeğer repmat(a, m, n)olan tile(a, (m, n)).

Bu, birden çok boyutla çalışır ve matlab'a benzer bir sonuç verir. (Numpy, beklediğiniz gibi 3 boyutlu bir çıktı dizisi verir - bazı nedenlerden dolayı matlab 2d çıktı verir - ancak içerik aynıdır).

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
boyutu denediğimde (repmat ([1; 1], [1,1,2])) ans = 2 1 2 [matlab'de] ama python np.tile (a, [1,1,2]) .shape it get (1, 2, 2),
hissizin

2
np.tile (a [:, np.newaxis], [1,1,2]) - aynı şeyi verir. Sorun, döşemenin, gerektiği gibi yeni eksenler ekleyereka karo argümanının boyutunu ilerletmesidir . Matlab başka bir şekilde çalışıyor gibi görünüyor. Benzer şekilde, 4d döşeme ile iki kez yeni eksene ihtiyacınız olacak ... yani np.tile(a[:,newaxis,newaxis],[1,2,3,4]) = size(repmat(a,[1 2 3 4]))gerektiği gibi ...
robince

17

MATLAB'ın repmatını kullanmanız gereken bazı nedenlerin , benzer şekle sahip dizilerle çeşitli matematik türleri yapmanıza izin veren NumPy'nin yayın mekanizması tarafından halledildiğini unutmayın. Öyleyse, diyelim ki, 3 renkli bir görüntüyü temsil eden 1600x1400x3 bir diziniz varsa [1.0 0.25 0.25], her pikseldeki yeşil ve mavi miktarını azaltmak için onu (eleman bazında) çarpabilirsiniz . Daha fazla bilgi için yukarıdaki bağlantıya bakın.


2
Matlab kullanırsanız bu yayını da yapamaz bsxfun.
gerrit


8

Bu, biraz uğraşarak bunu böyle anladım. Düzeltildiğine sevindim ve bunun yardımcı olacağını umuyoruz.

2x3 elemanlı bir M matrisiniz olduğunu varsayalım. Bunun iki boyutu var tabii ki.


Matlab ve Python arasında, matrisin halihazırda sahip olduğu boyutlar boyunca giriş matrisini manipüle etmek isterken hiçbir fark göremedim. Böylece iki komut

repmat(M,m,n) % matlab

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

rank 2 (iki boyut) matrisi için gerçekten eşdeğerdir.


Girdi matrisinin sahip olduğundan daha fazla boyut üzerinde tekrarlama / döşeme istediğinizde, konular sezgisel hale gelir. İkinci derece ve 2x3 şeklindeki M matrisine geri dönersek, çıktı matrisinin boyutuna / şekline ne olduğuna bakmak yeterlidir. Diyelim ki manipülasyon sırası 1,1,2.

Matlab'da

> size(repmat(M,1,1,2))
ans =

    2   3   2

girdi matrisinin ilk iki boyutunu (satırlar ve sütunlar) kopyaladı ve bunu bir kez yeni bir üçüncü boyuta tekrarladı (iki kez kopyalandı). repmatYineleme matrisinin adlandırılmasına sadık.

Python'da

>>> np.tile(M,(1,1,2)).shape
(1, 2, 6)

(1,1,2) dizisinin Matlab'dakinden farklı okunduğunu varsaydığım için farklı bir prosedür uygulamıştır. Sütun, satır ve düzlem dışı boyut yönündeki kopya sayısı sağdan sola doğru okunur. Ortaya çıkan nesnenin Matlab'den farklı bir şekli vardır. Artık bunu iddia edemezsiniz repmatve tileeşdeğer talimatlardır.


Amacıyla elde etmek tilegibi davranmaya repmatPython tek sağlam elementler gibi birçok boyutları sırayla olarak giriş matris olduğu yapmak zorundadır olarak,. Bu, örneğin, biraz ön koşullandırma ve ilgili bir nesne oluşturarak yapılır N

N = M[:,:,np.newaxis]

Ardından, giriş tarafında çıkış tarafında N.shape = (2,3,1)yerine M.shape = (2,3)ve

>>> np.tile(N,(1,1,2)).shape
(2, 3, 2)

cevabı buydu size(repmat(M,1,1,2)). Sanırım bunun nedeni, Python'a üçüncü boyutu soluna değil (2,3) 'ün sağına eklemesi için yönlendirmiş olmamızdır, böylece Python, Matlab'da tasarlandığı gibi diziyi (1,1,2) çalıştırır. okuma yolu.

Öğesi [:,:,0]Python yanıtında N eleman ile aynı değerleri içerir (:,:,1)Matlab cevap M .


Son olarak, repmatKronecker ürününün dışında kullanıldığında bir eşdeğer bulamıyorum .

>>> np.kron(np.ones((1,1,2)),M).shape
(1, 2, 6)

Daha sonra ön koşul değilse E içine N , yukarıdaki gibi. Bu yüzden devam etmenin en genel yolunun yollarını kullanmak olduğunu iddia ediyorum np.newaxis.


3. Seviye bir L matrisini (üç boyut) ve çıktı matrisine yeni boyut eklenmemesinin basit durumunu düşündüğümüzde oyun daha da zorlaşıyor . Bu iki görünüşte eşdeğer talimat aynı sonuçları vermeyecektir.

repmat(L,p,q,r) % matlab

np.tile(L,(p,q,r)) # python

çünkü satır, sütun, düzlem dışı yönler Matlab'da (p, q, r) ve Python'da (q, r, p) 'dir, bu 2. sıra dizileriyle görünmez. Orada, dikkatli olunmalı ve iki dil ile aynı sonuçları elde etmek daha fazla ön koşullama gerektirecektir.


Bu muhakemenin genel olmayabileceğinin farkındayım, ancak bunu ancak şu ana kadar çözebilirim. Umarım bu, diğer arkadaşları daha zor bir teste davet eder.


6

İkisini de bilin tileve repeat.

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

1

numpy.matlib, matlab işlevi ile benzer bir arayüze sahip bir repmat işlevine sahiptir

from numpy.matlib import repmat
repmat( np.array([[1],[1]]) , 1, 1)

0
>>> 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]])
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.