Yanıtlar:
İş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]]])
a
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 ...
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.
bsxfun
.
Matlab kullanıcıları için NumPy'ye bakın .
Matlab:
repmat(a, 2, 3)
Dizi:
numpy.kron(numpy.ones((2,3)), a)
Numpy'deki Matlib ( numpy.matlib.repmat () ):
numpy.matlib.repmat(a, 2, 3)
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ı). repmat
Yineleme 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 repmat
ve tile
eşdeğer talimatlardır.
Amacıyla elde etmek tile
gibi davranmaya repmat
Python 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, repmat
Kronecker ü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.
İkisini de bilin tile
ve repeat
.
x = numpy.arange(5)
print numpy.tile(x, 2)
print x.repeat(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]])