Terkadang berguna untuk "mengkloning" vektor baris atau kolom ke sebuah matriks. Dengan kloning maksud saya mengkonversi vektor baris seperti
[1,2,3]
Ke dalam sebuah matriks
[[1,2,3]
[1,2,3]
[1,2,3]
]
atau vektor kolom seperti
[1
2
3
]
ke
[[1,1,1]
[2,2,2]
[3,3,3]
]
Di matlab atau oktaf ini dilakukan dengan cukup mudah:
x = [1,2,3]
a = ones(3,1) * x
a =
1 2 3
1 2 3
1 2 3
b = (x') * ones(1,3)
b =
1 1 1
2 2 2
3 3 3
Saya ingin mengulangi ini dalam numpy, tetapi tidak berhasil
In [14]: x = array([1,2,3])
In [14]: ones((3,1)) * x
Out[14]:
array([[ 1., 2., 3.],
[ 1., 2., 3.],
[ 1., 2., 3.]])
# so far so good
In [16]: x.transpose() * ones((1,3))
Out[16]: array([[ 1., 2., 3.]])
# DAMN
# I end up with
In [17]: (ones((3,1)) * x).transpose()
Out[17]:
array([[ 1., 1., 1.],
[ 2., 2., 2.],
[ 3., 3., 3.]])
Mengapa metode pertama ( In [16]
) tidak berfungsi? Apakah ada cara untuk mencapai tugas ini dengan python dengan cara yang lebih elegan?
python
numpy
linear-algebra
Boris Gorelik
sumber
sumber
repmat
:repmat([1 2 3],3,1)
ataurepmat([1 2 3].',1,3)
repmat
.tile_df
tertaut di siniJawaban:
Berikut cara Pythonic yang elegan untuk melakukannya:
masalah dengan
[16]
tampaknya bahwa transpose tidak berpengaruh pada array. Anda mungkin menginginkan sebuah matriks sebagai gantinya:sumber
(N,1)
array -shape using.reshape(-1, 1)
)numpy.tile
seperti yang ditunjukkan pada jawaban pv .Menggunakan
numpy.tile
:atau untuk kolom berulang:
sumber
tile
metode ini 19,5 kali lebih cepat daripada metode dalam jawaban yang saat ini diterima (menggunakan metode multiplication-operator-method).(1, 3)
menyalin kolom ini lebih dari tiga kali, itulah sebabnya mengapa setiap baris hasil mengandung elemen tunggal yang berbeda.Pertama-tama perhatikan bahwa dengan operasi penyiaran numpy , biasanya tidak perlu menduplikasi baris dan kolom. Lihat ini dan ini untuk deskripsi.
Tetapi untuk melakukan ini, repeat dan newaxis mungkin adalah cara terbaik
Contoh ini untuk vektor baris, tetapi menerapkan ini ke vektor kolom mudah-mudahan jelas. pengulangan sepertinya mengeja ini dengan baik, tetapi Anda juga bisa melakukannya melalui perkalian seperti dalam contoh Anda
sumber
np.repeat
vsnp.tile
?Membiarkan:
Alokasi tanpa biaya
Sebuah pandangan tidak mengambil memori tambahan. Dengan demikian, deklarasi ini bersifat instan:
Alokasi paksa
Jika Anda ingin memaksa konten berada di memori:
Ketiga metode ini memiliki kecepatan yang kira-kira sama.
Komputasi
Ketiga metode ini memiliki kecepatan yang kira-kira sama.
Kesimpulan
Jika Anda ingin mereplikasi sebelum perhitungan, pertimbangkan untuk menggunakan salah satu metode "alokasi biaya nol". Anda tidak akan menderita penalti kinerja "alokasi paksa".
sumber
Saya pikir menggunakan siaran dalam numpy adalah yang terbaik, dan lebih cepat
Saya melakukan perbandingan sebagai berikut
sekitar 15 kali lebih cepat menggunakan siaran
sumber
None
untuk melakukan hal yang sama.Salah satu solusi bersih adalah menggunakan fungsi produk luar NumPy dengan vektornya:
memberikan
n
baris berulang. Ganti urutan argumen untuk mendapatkan kolom berulang. Untuk mendapatkan jumlah baris dan kolom yang sama dengan yang mungkin Anda lakukansumber
Kamu bisa memakai
ubin akan menghasilkan repetisi dari vektor
dan membentuk kembali akan memberikan bentuk yang Anda inginkan
sumber
Jika Anda memiliki kerangka data panda dan ingin mempertahankan dtypes, bahkan kategorikal, ini adalah cara cepat untuk melakukannya:
sumber
hasil:
sumber