Saya ingin mengeksekusi setara dengan kode MATLAB berikut menggunakan NumPy: repmat([1; 1], [1 1 1])
. Bagaimana saya mencapai ini?
103
Berikut ini adalah tautan NumPy untuk Pengguna Matlab (resmi) yang jauh lebih baik - Saya khawatir tautan mathesaurus sudah ketinggalan zaman.
Padanan numpy repmat(a, m, n)
adalah tile(a, (m, n))
.
Ini bekerja dengan banyak dimensi dan memberikan hasil yang mirip dengan matlab. (Numpy memberikan larik keluaran 3d seperti yang Anda harapkan - matlab karena alasan tertentu memberikan keluaran 2d - tetapi isinya sama).
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
dimensi argumen petak dengan menyiapkan sumbu baru jika diperlukan. Matlab tampaknya bekerja sebaliknya. Demikian pula, dengan pemasangan ubin 4d Anda akan membutuhkan sumbu baru dua kali ... jadinp.tile(a[:,newaxis,newaxis],[1,2,3,4]) = size(repmat(a,[1 2 3 4]))
sesuai kebutuhan ...Perhatikan bahwa beberapa alasan Anda perlu menggunakan repmat MATLAB ditangani oleh mekanisme penyiaran NumPy , yang memungkinkan Anda melakukan berbagai jenis matematika dengan larik berbentuk serupa. Jadi, jika Anda memiliki, katakanlah, larik 1600x1400x3 yang mewakili gambar 3 warna, Anda dapat (berdasarkan elemen) mengalikannya dengan
[1.0 0.25 0.25]
untuk mengurangi jumlah hijau dan biru di setiap piksel. Lihat tautan di atas untuk informasi lebih lanjut.sumber
bsxfun
.Lihat NumPy untuk pengguna Matlab .
Matlab:
Numpy:
Matlib di Numpy ( numpy.matlib.repmat () ):
sumber
Beginilah cara saya memahaminya dari sedikit mengotak-atik. Senang bisa dikoreksi dan semoga ini membantu.
Katakanlah Anda memiliki matriks M dari elemen 2x3. Ini jelas memiliki dua dimensi.
Saya tidak bisa melihat perbedaan antara Matlab dan Python saat meminta untuk memanipulasi matriks masukan sepanjang dimensi yang sudah dimiliki matriks. Demikianlah kedua perintah tersebut
benar-benar setara untuk matriks peringkat 2 (dua dimensi).
Masalahnya menjadi kontra-intuitif ketika Anda meminta pengulangan / ubin pada lebih banyak dimensi daripada yang dimiliki matriks input. Kembali ke matriks M dari peringkat dua dan bentuk 2x3, sudah cukup untuk melihat apa yang terjadi pada ukuran / bentuk matriks keluaran. Katakanlah urutan manipulasi sekarang 1,1,2.
Di Matlab
itu telah menyalin dua dimensi pertama (baris dan kolom) dari matriks masukan dan telah mengulanginya sekali ke dimensi ketiga yang baru (disalin dua kali, yaitu). Sesuai dengan penamaan
repmat
untuk matriks berulang.Dengan Python
itu telah menerapkan prosedur yang berbeda karena, saya kira, urutan (1,1,2) dibaca berbeda dari pada di Matlab. Jumlah salinan dalam arah kolom, baris, dan dimensi di luar bidang sedang dibaca dari kanan ke kiri. Objek yang dihasilkan memiliki bentuk yang berbeda dengan Matlab. Seseorang tidak dapat lagi menegaskan itu
repmat
dantile
merupakan instruksi yang setara.Untuk
tile
berperilaku sepertirepmat
, dalam Python seseorang harus memastikan bahwa matriks masukan memiliki dimensi sebanyak elemen dalam urutannya. Ini dilakukan, misalnya, dengan sedikit prakondisi dan membuat objek terkait NKemudian, di sisi masukan seseorang memiliki
N.shape = (2,3,1)
daripadaM.shape = (2,3)
dan di sisi keluaranyang merupakan jawaban dari
size(repmat(M,1,1,2))
. Saya kira ini karena kami telah memandu Python untuk menambahkan dimensi ketiga ke kanan (2,3) daripada ke kiri, sehingga Python mengerjakan urutan (1,1,2) seperti yang dimaksudkan di Matlab cara membacanya.Unsur di
[:,:,0]
dalam jawaban Python untuk N akan berisi nilai yang sama seperti elemen(:,:,1)
jawaban Matlab untuk M .Akhirnya, saya tidak bisa menemukan padanan
repmat
ketika seseorang menggunakan produk Kronecker darikecuali saya kemudian memprakondisikan M menjadi N seperti di atas. Jadi saya berpendapat bahwa cara paling umum untuk melanjutkan adalah dengan menggunakan cara
np.newaxis
.Permainan menjadi lebih rumit ketika kita mempertimbangkan matriks L dari peringkat 3 (tiga dimensi) dan kasus sederhana tidak ada dimensi baru yang ditambahkan dalam matriks keluaran. Kedua instruksi yang tampaknya setara ini tidak akan menghasilkan hasil yang sama
karena baris, kolom, arah out-of-plane adalah (p, q, r) di Matlab dan (q, r, p) di Python, yang tidak terlihat dengan array rank-2. Di sana, seseorang harus berhati-hati dan mendapatkan hasil yang sama dengan dua bahasa akan membutuhkan lebih banyak pengkondisian awal.
Saya sadar bahwa alasan ini mungkin tidak umum, tetapi saya hanya bisa menyelesaikannya sejauh ini. Semoga ini mengundang rekan-rekan lainnya untuk mengujinya lebih keras.
sumber
Tahu keduanya
tile
danrepeat
.sumber
numpy.matlib memiliki repmat fungsi dengan antarmuka yang mirip dengan fungsi matlab
sumber
sumber