Transposing array NumPy


193

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.Ttidak mentransposisi array. Jika amisalnya [[],[]]maka transpos dengan benar, tetapi saya perlu transpos [...,...,...].


juga mencoba "cetak a.transpose" yang sama tetapi tanpa keberhasilan, bukan transpos ...
thaking

Jawaban:


247

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(atau None, mereka sama, newaxishanya lebih mudah dibaca).

import numpy as np
a = np.array([5,4])[np.newaxis]
print(a)
print(a.T)

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.


2
@thaking - Saya hanya terbiasa np.arangedengan cepat membuat array 1D. Ini berfungsi persis sama untuk a = np.array([5,4]).
Joe Kington

2
@mengambil Jika Anda baru mengenal numpy - perlu diingat bahwa kurung bundar ()tidak menunjukkan dimensi tambahan di numpy. Jika a = np.arange(10)kemudian aadalah array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])seperti yang dihasilkan oleh a.__repr__(). Ini adalah a.ndim --> 1vektor 1-dimensi (yaitu ) seperti ditunjukkan oleh tanda kurung []. Itu array( ... )tidak terlihat ketika Anda melakukan salah satu print(a)atau a.__str__().
dtlussier

7
@ JoKington ada situasi bahwa penyiaran array 1D berguna. Menghitung jarak antara semua titik 1D dalam array. Berkat solusi Anda, seseorang dapat melakukan x - x [np.newaxis]. T yang memberikan matriks jarak
JuanPi

4
Secara pribadi, saya menemukan np.vstack()operasi menjadi lebih eksplisit: print np.vstack(a).
Alexander Pozdneev

2
Ini bukan hanya matlab, tetapi aljabar linier memiliki konsep vektor baris / kolom. Numpy istimewa bagi orang-orang yang datang dari banyak tempat, bukan hanya matlab.
eric

135

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.

import numpy as np    
a = np.array([[5, 4]])
a.T

Contoh yang lebih teliti:

>>> a = [3,6,9]
>>> b = np.array(a)
>>> b.T
array([3, 6, 9])         #Here it didn't transpose because 'a' is 1 dimensional
>>> b = np.array([a])
>>> b.T
array([[3],              #Here it did transpose because a is 2 dimensional
       [6],
       [9]])

Gunakan shapemetode numpy untuk melihat apa yang terjadi di sini:

>>> b = np.array([10,20,30])
>>> b.shape
(3,)
>>> b = np.array([[10,20,30]])
>>> b.shape
(1, 3)

11
Saya lebih suka solusi ini daripada [np.newaxis], sepertinya imo lebih elegan.
PhilMacKay

Mesin tidak secerdas itu. Bahkan jika Anda hanya memiliki satu istri, itu harus dinyatakan sebagai istri pertama Anda.
Sreeragh AR

Ini harus menjadi jawaban yang dipilih
bruno

79

Untuk array 1D :

a = np.array([1, 2, 3, 4])
a = a.reshape((-1, 1)) # <--- THIS IS IT

print a
array([[1],
       [2],
       [3],
       [4]])

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.


5
Perhatikan bahwa ini hanya berfungsi dengan vektor. Jika Anda memiliki array 2 dimensi, operasinya transposedan reshapememodifikasi array dengan cara yang berbeda (bentuk gambar yang dihasilkan sama, tetapi elemen-elemennya ditempatkan secara berbeda).
johndodo

2
Terima kasih atas komentar anda Saya mengerti maksud Anda, tetapi saya pikir itu mengalihkan perhatian lebih dari itu membersihkan jawaban saya karena saya memang memberikan solusi satu-baris sederhana untuk pertanyaan yang tepat bahwa @ mengambil bingkai. Ini bukan tentang array 2-d, ini tentang array 1-d. Apel dan pir di sini.
Ulf Aslak

2
Tentu saja. Jawaban Anda benar dan elegan untuk kasus ini, saya tidak pernah bermaksud untuk mengkritiknya. Tetapi mengingat judul pertanyaan ("Transposing a NumPy array") Saya menduga banyak pengunjung akan datang ke sini mencari solusi yang lebih umum dan saya ingin memperingatkan mereka bahwa itu tidak berlaku untuk array 2D. Kalau tidak, jawaban Anda benar dan sesuai dengan pertanyaan OP.
johndodo

@UlfAslak, harap perbarui jawaban Anda bahwa pendekatan Anda tidak dapat digeneralisasikan ke ND array, itu selalu baik untuk menjadi jelas di depan seperti yang disarankan oleh! Johndodo, sehingga tidak ada yang harus menggunakan teknik Anda dengan salah.! & bukan liner.!
Anu

18

Anda dapat mengubah vektor yang sudah ada menjadi matriks dengan membungkusnya dalam satu set kurung persegi tambahan ...

from numpy import *
v=array([5,4]) ## create a numpy vector
array([v]).T ## transpose a vector into a matrix

numpy juga memiliki matrixkelas (lihat array vs. matriks ) ...

matrix(v).T ## transpose a vector into a matrix

14

array 1D numpy -> kolom / baris matriks:

>>> a=np.array([1,2,4])
>>> a[:, None]    # col
array([[1],
       [2],
       [4]])
>>> a[None, :]    # row, or faster `a[None]`
array([[1, 2, 4]])

Dan seperti yang dikatakan @ joe-kington, Anda dapat menggantinya Nonedengan np.newaxisuntuk keterbacaan.


10

Untuk 'mengubah posisi' array 1d ke kolom 2d, Anda dapat menggunakan numpy.vstack:

>>> numpy.vstack(numpy.array([1,2,3]))
array([[1],
       [2],
       [3]])

Ini juga berfungsi untuk daftar vanilla:

>>> numpy.vstack([1,2,3])
array([[1],
       [2],
       [3]])

1
@sandroscodelller, sudahkah Anda melihat kode yang mendasarinya 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.
hpaulj

3

Anda hanya dapat mengubah urutan array 2D. Anda dapat menggunakan numpy.matrixuntuk membuat array 2D. Ini terlambat tiga tahun, tetapi saya hanya menambah set solusi yang mungkin:

import numpy as np
m = np.matrix([2, 3])
m.T

Penggunaan np.matrixtidak diperlukan, dan umumnya tidak dianjurkan.
hpaulj



2

Solusi lain .... :-)

import numpy as np

a = [1,2,4]

[1, 2, 4]

b = np.array([a]).T

array ([[1], [2], [4]])


Apa masalah dengan solusi ini ?!
omotto

1

Saya hanya mengkonsolidasikan posting di atas, semoga akan membantu orang lain menghemat waktu:

Array di bawah ini memiliki (2, )dimensi, array 1-D,

b_new = np.array([2j, 3j])  

Ada dua cara untuk mengubah urutan array 1-D:


iris dengan "np.newaxis" atau tidak sama sekali!

print(b_new[np.newaxis].T.shape)
print(b_new[None].T.shape)

cara penulisan lain, di atas tanpa Toperasi.!

print(b_new[:, np.newaxis].shape)
print(b_new[:, None].shape)

Membungkus [] atau menggunakan np.matrix, berarti menambahkan dimensi baru.!

print(np.array([b_new]).T.shape)
print(np.matrix(b_new).T.shape)

0

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:

np.transpose(a.reshape(len(a), 1))


0

Ada metode yang tidak dijelaskan dalam jawaban tetapi dijelaskan dalam dokumentasi untuk numpy.ndarray.transposemetode ini:

Untuk larik 1-D ini tidak berpengaruh, karena vektor yang ditransposisikan hanyalah vektor yang sama. Untuk mengubah array 1-D menjadi vektor kolom 2D, dimensi tambahan harus ditambahkan. np.atleast2d (a) .T mencapai ini, seperti halnya [:, np.newaxis].

Yang bisa dilakukan:

import numpy as np
a = np.array([5,4])
print(a)
print(np.atleast_2d(a).T)

Mana (imo) lebih bagus daripada menggunakan newaxis.


0

Pada dasarnya yang dilakukan fungsi transpose adalah menukar bentuk dan langkah array:

>>> a = np.ones((1,2,3))

>>> a.shape
(1, 2, 3)

>>> a.T.shape
(3, 2, 1)

>>> a.strides
(48, 24, 8)

>>> a.T.strides
(8, 24, 48)

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:

from numpy.lib.stride_tricks import as_strided

def transpose(a):
    a = np.atleast_2d(a)
    return as_strided(a, shape=a.shape[::-1], strides=a.strides[::-1])

Contoh:

>>> a = np.arange(3)
>>> a
array([0, 1, 2])

>>> transpose(a)
array([[0],
       [1],
       [2]])

>>> a = np.arange(1, 7).reshape(2,3)
>>> a     
array([[1, 2, 3],
       [4, 5, 6]])

>>> transpose(a)
array([[1, 4],
       [2, 5],
       [3, 6]])

Tentu saja Anda tidak perlu melakukannya dengan cara ini karena Anda memiliki array 1D dan Anda dapat langsung membentuknya kembali menjadi (n, 1)array dengan a.reshape((-1, 1))atau a[:, None]. Saya hanya ingin menunjukkan bagaimana transposing array bekerja.


0

Cara saya telah belajar menerapkan ini dalam cara yang ringkas dan mudah dibaca untuk array 1-D, sejauh ini:

h = np.array([1,2,3,4,5])

v1 = np.vstack(h)
v2 = np.c_[h]

h1 = np.hstack(v1)
h2 = np.r_[v2[:,0]]

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 .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.