Saya menggunakan Python dan NumPy dan memiliki beberapa masalah dengan "transpos":
import numpy as np
a = np.array([5,4])
print(a)
print(a.T)
Meminta a.T
tidak mentransposisi array. Jika a
misalnya [[],[]]
maka transpos dengan benar, tetapi saya perlu transpos [...,...,...]
.
Jawaban:
Ini bekerja persis seperti yang seharusnya. Transpos array 1D masih berupa array 1D ! (Jika Anda terbiasa dengan matlab, pada dasarnya tidak memiliki konsep array 1D. "1D" array Matlab adalah 2D.)
Jika Anda ingin mengubah vektor 1D Anda menjadi array 2D dan kemudian memindahkannya, cukup iris dengan
np.newaxis
(atauNone
, mereka sama,newaxis
hanya lebih mudah dibaca).Namun secara umum, Anda tidak perlu khawatir tentang ini. Menambahkan dimensi ekstra biasanya bukan yang Anda inginkan, jika Anda melakukannya hanya karena kebiasaan. Numpy akan secara otomatis menyiarkan larik 1D saat melakukan berbagai perhitungan. Biasanya tidak perlu membedakan antara vektor baris dan vektor kolom (keduanya bukan vektor . Keduanya 2D!) Saat Anda hanya menginginkan vektor.
sumber
np.arange
dengan cepat membuat array 1D. Ini berfungsi persis sama untuka = np.array([5,4])
.()
tidak menunjukkan dimensi tambahan di numpy. Jikaa = np.arange(10)
kemudiana
adalaharray([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
seperti yang dihasilkan oleha.__repr__()
. Ini adalaha.ndim --> 1
vektor 1-dimensi (yaitu ) seperti ditunjukkan oleh tanda kurung[]
. Ituarray( ... )
tidak terlihat ketika Anda melakukan salah satuprint(a)
ataua.__str__()
.np.vstack()
operasi menjadi lebih eksplisit:print np.vstack(a)
.Gunakan dua pasang braket, bukan satu. Ini menciptakan array 2D, yang dapat ditransposisikan, tidak seperti array 1D yang Anda buat jika Anda menggunakan satu pasangan braket.
Contoh yang lebih teliti:
Gunakan
shape
metode numpy untuk melihat apa yang terjadi di sini:sumber
Untuk array 1D :
Setelah Anda memahami bahwa -1 di sini berarti "sebanyak baris yang diperlukan", saya menemukan ini menjadi cara yang paling mudah dibaca "mentransposisi" sebuah array. Jika array Anda memiliki dimensi yang lebih tinggi, gunakan saja
a.T
.sumber
transpose
danreshape
memodifikasi array dengan cara yang berbeda (bentuk gambar yang dihasilkan sama, tetapi elemen-elemennya ditempatkan secara berbeda).Anda dapat mengubah vektor yang sudah ada menjadi matriks dengan membungkusnya dalam satu set kurung persegi tambahan ...
numpy juga memiliki
matrix
kelas (lihat array vs. matriks ) ...sumber
array 1D numpy -> kolom / baris matriks:
Dan seperti yang dikatakan @ joe-kington, Anda dapat menggantinya
None
dengannp.newaxis
untuk keterbacaan.sumber
Untuk 'mengubah posisi' array 1d ke kolom 2d, Anda dapat menggunakan
numpy.vstack
:Ini juga berfungsi untuk daftar vanilla:
sumber
vstack
?np.concatenate([atleast_2d(_m) for _m in tup], 0)
. Membagi array menjadi (1,1) array, dan menggabungkannya! Dalam proses itu membuat salinan, sedangkan semua yang membentuk kembali membuat tampilan.Anda hanya dapat mengubah urutan array 2D. Anda dapat menggunakan
numpy.matrix
untuk membuat array 2D. Ini terlambat tiga tahun, tetapi saya hanya menambah set solusi yang mungkin:sumber
np.matrix
tidak diperlukan, dan umumnya tidak dianjurkan.alih-alih gunakan
arr[:,None]
untuk membuat vektor kolomsumber
Transpos dari
adalah
baik kodenya adalah:
ini tautan untuk informasi lebih lanjut:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.transpose.html
sumber
Solusi lain .... :-)
sumber
Saya hanya mengkonsolidasikan posting di atas, semoga akan membantu orang lain menghemat waktu:
Array di bawah ini memiliki
(2, )
dimensi, array 1-D,Ada dua cara untuk mengubah urutan array 1-D:
iris dengan "np.newaxis" atau tidak sama sekali!
cara penulisan lain, di atas tanpa
T
operasi.!Membungkus [] atau menggunakan np.matrix, berarti menambahkan dimensi baru.!
sumber
Seperti beberapa komentar yang disebutkan di atas, transpos dari array 1D adalah array 1D, jadi salah satu cara untuk mengubah posisi array 1D adalah dengan mengubah array menjadi matriks seperti:
sumber
Nama fungsi dalam
numpy
adalah column_stack .sumber
Ada metode yang tidak dijelaskan dalam jawaban tetapi dijelaskan dalam dokumentasi untuk
numpy.ndarray.transpose
metode ini:Yang bisa dilakukan:
Mana (imo) lebih bagus daripada menggunakan
newaxis
.sumber
Pada dasarnya yang dilakukan fungsi transpose adalah menukar bentuk dan langkah array:
Dalam kasus array 1D numpy (rank-1 array) bentuk dan langkahnya adalah tupel 1 elemen dan tidak dapat ditukar, dan transpos array 1D seperti itu mengembalikannya tidak berubah. Sebagai gantinya, Anda dapat mengubah posisi "vektor-baris" (array bentuk numpy
(1, n)
) menjadi "vektor-kolom" (array bentuk numpy(n, 1)
). Untuk mencapai ini, Anda harus terlebih dahulu mengkonversi array 1D numpy Anda menjadi vektor-baris dan kemudian menukar bentuk dan langkahnya (transpos). Di bawah ini adalah fungsi yang melakukannya:Contoh:
Tentu saja Anda tidak perlu melakukannya dengan cara ini karena Anda memiliki array 1D dan Anda dapat langsung membentuknya kembali menjadi
(n, 1)
array dengana.reshape((-1, 1))
ataua[:, None]
. Saya hanya ingin menunjukkan bagaimana transposing array bekerja.sumber
Cara saya telah belajar menerapkan ini dalam cara yang ringkas dan mudah dibaca untuk array 1-D, sejauh ini:
numpy.r_ dan numpy.c_ menerjemahkan objek slice ke concatenation sepanjang sumbu pertama dan kedua. Oleh karena itu slicing v2 [:, 0] dalam mentransposisi kembali array vertikal v2 ke dalam array horizontal h2
numpy.vstack setara dengan penggabungan sepanjang sumbu pertama setelah 1-D array bentuk (N,) telah dibentuk kembali menjadi (1, N). Bangun kembali array dibagi dengan vsplit .
sumber