Bagaimana cara kerja numpy.newaxis dan kapan menggunakannya?


186

Ketika saya mencoba

numpy.newaxis

hasilnya memberi saya bingkai plot 2-d dengan sumbu x dari 0 hingga 1. Namun, ketika saya mencoba menggunakan numpy.newaxisuntuk mengiris vektor,

vector[0:4,]
[ 0.04965172  0.04979645  0.04994022  0.05008303]
vector[:, np.newaxis][0:4,]
[[ 0.04965172]
[ 0.04979645]
[ 0.04994022]
[ 0.05008303]]

Apakah itu hal yang sama kecuali bahwa itu mengubah vektor baris ke vektor kolom?

Secara umum, apa gunanya numpy.newaxis, dan dalam keadaan apa kita harus menggunakannya?


1
except that it changes a row vector to a column vector? Contoh pertama bukan vektor baris. Itu konsep matlab. Dalam python itu hanya vektor 1 dimensi tanpa konsep baris atau kolom. Vektor baris atau kolom adalah 2-dimensonal, seperti contoh kedua
endolith

Jawaban:


330

Sederhananya, numpy.newaxisdigunakan untuk meningkatkan dimensi array yang ada dengan satu dimensi lagi , bila digunakan sekali . Jadi,

  • 1D array akan menjadi array 2D

  • Array 2D akan menjadi array 3D

  • Array 3D akan menjadi array 4D

  • Array 4D akan menjadi array 5D

dan seterusnya..

Berikut ini adalah ilustrasi visual yang menggambarkan promosi array 1D ke array 2D.

visualisasi canva newaxis


Skenario-1 : np.newaxismungkin berguna ketika Anda ingin secara eksplisit mengubah array 1D menjadi vektor baris atau vektor kolom , seperti yang digambarkan dalam gambar di atas.

Contoh:

# 1D array
In [7]: arr = np.arange(4)
In [8]: arr.shape
Out[8]: (4,)

# make it as row vector by inserting an axis along first dimension
In [9]: row_vec = arr[np.newaxis, :]     # arr[None, :]
In [10]: row_vec.shape
Out[10]: (1, 4)

# make it as column vector by inserting an axis along second dimension
In [11]: col_vec = arr[:, np.newaxis]     # arr[:, None]
In [12]: col_vec.shape
Out[12]: (4, 1)

Skenario-2 : Ketika kita ingin menggunakan siaran numpy sebagai bagian dari beberapa operasi, misalnya saat melakukan penambahan beberapa array.

Contoh:

Katakanlah Anda ingin menambahkan dua array berikut:

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

Jika Anda mencoba menambahkan ini begitu saja, NumPy akan meningkatkan yang berikut ValueError:

ValueError: operands could not be broadcast together with shapes (5,) (3,)

Dalam situasi ini, Anda dapat menggunakan np.newaxisuntuk meningkatkan dimensi salah satu array sehingga NumPy dapat disiarkan .

In [2]: x1_new = x1[:, np.newaxis]    # x1[:, None]
# now, the shape of x1_new is (5, 1)
# array([[1],
#        [2],
#        [3],
#        [4],
#        [5]])

Sekarang, tambahkan:

In [3]: x1_new + x2
Out[3]:
array([[ 6,  5,  4],
       [ 7,  6,  5],
       [ 8,  7,  6],
       [ 9,  8,  7],
       [10,  9,  8]])

Atau, Anda juga dapat menambahkan sumbu baru ke array x2:

In [6]: x2_new = x2[:, np.newaxis]    # x2[:, None]
In [7]: x2_new     # shape is (3, 1)
Out[7]: 
array([[5],
       [4],
       [3]])

Sekarang, tambahkan:

In [8]: x1 + x2_new
Out[8]: 
array([[ 6,  7,  8,  9, 10],
       [ 5,  6,  7,  8,  9],
       [ 4,  5,  6,  7,  8]])

Catatan : Amati bahwa kita mendapatkan hasil yang sama dalam kedua kasus (tetapi yang satu adalah transpose yang lain).


Skenario-3 : Ini mirip dengan skenario-1. Namun, Anda dapat menggunakan np.newaxislebih dari satu kali untuk mempromosikan array ke dimensi yang lebih tinggi. Operasi semacam itu kadang-kadang diperlukan untuk array orde tinggi ( yaitu Tensor ).

Contoh:

In [124]: arr = np.arange(5*5).reshape(5,5)

In [125]: arr.shape
Out[125]: (5, 5)

# promoting 2D array to a 5D array
In [126]: arr_5D = arr[np.newaxis, ..., np.newaxis, np.newaxis]    # arr[None, ..., None, None]

In [127]: arr_5D.shape
Out[127]: (1, 5, 5, 1, 1)

Lebih banyak latar belakang di np.newaxis vs np.reshape

newaxis juga disebut sebagai pseudo-index yang memungkinkan penambahan sementara sumbu ke multiarray.

np.newaxismenggunakan operator slicing untuk membuat ulang array sementara np.reshapemembentuk kembali array ke tata letak yang diinginkan (dengan asumsi bahwa dimensi cocok; Dan ini harus dilakukan reshapeagar terjadi).

Contoh

In [13]: A = np.ones((3,4,5,6))
In [14]: B = np.ones((4,6))
In [15]: (A + B[:, np.newaxis, :]).shape     # B[:, None, :]
Out[15]: (3, 4, 5, 6)

Dalam contoh di atas, kami memasukkan sumbu sementara antara sumbu pertama dan kedua B(untuk menggunakan siaran). Sumbu yang hilang diisi di sini menggunakan np.newaxisuntuk membuat operasi penyiaran berfungsi.


Kiat Umum : Anda juga dapat menggunakanNonedi tempatnp.newaxis; Ini sebenarnya benda yang sama .

In [13]: np.newaxis is None
Out[13]: True

PS Juga lihat jawaban yang bagus ini: newaxis vs membentuk kembali untuk menambah dimensi


3
Apa jenis operasi x1_new + x2? Ini aneh bagi saya karena saya pikir dua matriks hanya dapat ditambahkan jika mereka memiliki dimensi yang sama (atau jika salah satu dari mereka sebenarnya hanya skalar).
Stephen

2
@Stephen Seperti yang saya catat dalam jawaban, itu karena NumPy Broadcasting.
kmario23

2
Ini adalah penjelasan yang luar biasa
Valdrinium

2
@valdrinit senang itu membantu Anda :)
kmario23

1
@ kmario23 Memang atribusi disembunyikan dalam kalimat terakhir artikel, tidak heran saya tidak melihatnya. Saya menganggapnya plagiarisme batas bahkan dengan atribusi ini. Dalam buku saya, penyalinan kata demi kata hanya dapat diterima jika penulis yang sama memposting di platform yang berbeda. Saya harapkan lebih baik dari Medium.
Chiraz BenAbdelkader

29

Apa np.newaxis?

Ini np.newaxishanyalah alias untuk konstanta Python None, yang berarti bahwa di mana pun Anda menggunakan np.newaxisAnda juga bisa menggunakan None:

>>> np.newaxis is None
True

Itu hanya lebih deskriptif jika Anda membaca kode yang menggunakan np.newaxisbukan None.

Cara menggunakan np.newaxis?

The np.newaxisumumnya digunakan dengan mengiris. Ini menunjukkan bahwa Anda ingin menambahkan dimensi tambahan ke array. Posisi np.newaxismewakili tempat saya ingin menambahkan dimensi.

>>> import numpy as np
>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> a.shape
(10,)

Dalam contoh pertama saya menggunakan semua elemen dari dimensi pertama dan menambahkan dimensi kedua:

>>> a[:, np.newaxis]
array([[0],
       [1],
       [2],
       [3],
       [4],
       [5],
       [6],
       [7],
       [8],
       [9]])
>>> a[:, np.newaxis].shape
(10, 1)

Contoh kedua menambahkan dimensi sebagai dimensi pertama dan kemudian menggunakan semua elemen dari dimensi pertama array asli sebagai elemen dalam dimensi kedua dari array hasil:

>>> a[np.newaxis, :]  # The output has 2 [] pairs!
array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
>>> a[np.newaxis, :].shape
(1, 10)

Demikian pula Anda dapat menggunakan beberapa np.newaxisuntuk menambahkan beberapa dimensi:

>>> a[np.newaxis, :, np.newaxis]  # note the 3 [] pairs in the output
array([[[0],
        [1],
        [2],
        [3],
        [4],
        [5],
        [6],
        [7],
        [8],
        [9]]])
>>> a[np.newaxis, :, np.newaxis].shape
(1, 10, 1)

Apakah ada alternatif lain np.newaxis?

Ada fungsi lain yang sangat mirip di NumPy:, np.expand_dimsyang juga dapat digunakan untuk memasukkan satu dimensi:

>>> np.expand_dims(a, 1)  # like a[:, np.newaxis]
>>> np.expand_dims(a, 0)  # like a[np.newaxis, :]

Tetapi mengingat itu hanya menyisipkan 1di shapeAnda juga bisa reshapearray untuk menambahkan dimensi ini:

>>> a.reshape(a.shape + (1,))  # like a[:, np.newaxis]
>>> a.reshape((1,) + a.shape)  # like a[np.newaxis, :]

Sebagian besar waktu np.newaxisadalah cara termudah untuk menambah dimensi, tetapi ada baiknya mengetahui alternatifnya.

Kapan harus menggunakan np.newaxis?

Dalam beberapa konteks menambahkan dimensi berguna:

  • Jika data harus memiliki jumlah dimensi yang ditentukan. Misalnya jika Anda ingin menggunakan matplotlib.pyplot.imshowuntuk menampilkan array 1D.

  • Jika Anda ingin NumPy menyiarkan array. Dengan menambahkan dimensi Anda bisa misalnya mendapatkan perbedaan antara semua elemen satu array: a - a[:, np.newaxis]. Ini berfungsi karena operasi NumPy disiarkan mulai dengan dimensi terakhir 1 .

  • Untuk menambahkan dimensi yang diperlukan sehingga NumPy dapat menyiarkan array. Ini berfungsi karena setiap dimensi panjang-1 hanya disiarkan ke panjang 1 dimensi yang sesuai dari array lainnya.


1 Jika Anda ingin membaca lebih lanjut tentang aturan penyiaran, dokumentasi NumPy tentang hal itu sangat bagus. Ini juga termasuk contoh dengan np.newaxis:

>>> a = np.array([0.0, 10.0, 20.0, 30.0])
>>> b = np.array([1.0, 2.0, 3.0])
>>> a[:, np.newaxis] + b
array([[  1.,   2.,   3.],
       [ 11.,  12.,  13.],
       [ 21.,  22.,  23.],
       [ 31.,  32.,  33.]])

Saya tidak melihat perbedaan antara kasus penggunaan kedua dan ketiga; keduanya tentang memungkinkan NumPy untuk menyiarkan array sebagai bagian dari beberapa operasi. Jika tidak, maka akan membantu untuk menambahkan contoh untuk use case ke-3 untuk memperjelas poin.
Chiraz BenAbdelkader

@ChirazBenAbdelkader Ya, perbedaannya tidak terlalu berbeda. Saya tidak yakin apakah saya harus menghapus titik ketiga atau menggabungkannya ke yang kedua.
MSeifert

9

Anda mulai dengan daftar angka satu dimensi. Setelah kamu digunakannumpy.newaxis , Anda mengubahnya menjadi matriks dua dimensi, yang terdiri dari empat baris masing-masing kolom.

Anda kemudian dapat menggunakan matriks itu untuk perkalian matriks, atau melibatkannya dalam pembangunan matriks 4 xn yang lebih besar.


5

newaxisobjek dalam tuple seleksi berfungsi untuk memperluas dimensi dari seleksi yang dihasilkan oleh satu unit-panjang dimensi .

Ini bukan hanya konversi matriks baris ke matriks kolom.

Perhatikan contoh di bawah ini:

In [1]:x1 = np.arange(1,10).reshape(3,3)
       print(x1)
Out[1]: array([[1, 2, 3],
               [4, 5, 6],
               [7, 8, 9]])

Sekarang mari tambahkan dimensi baru ke data kami,

In [2]:x1_new = x1[:,np.newaxis]
       print(x1_new)
Out[2]:array([[[1, 2, 3]],

              [[4, 5, 6]],

              [[7, 8, 9]]])

Anda bisa melihatnya newaxis menambahkan dimensi ekstra di sini, x1 memiliki dimensi (3,3) dan X1_new memiliki dimensi (3,1,3).

Bagaimana dimensi baru kami memungkinkan kami melakukan operasi yang berbeda:

In [3]:x2 = np.arange(11,20).reshape(3,3)
       print(x2)
Out[3]:array([[11, 12, 13],
              [14, 15, 16],
              [17, 18, 19]]) 

Menambahkan x1_new dan x2, kita mendapatkan:

In [4]:x1_new+x2
Out[4]:array([[[12, 14, 16],
               [15, 17, 19],
               [18, 20, 22]],

              [[15, 17, 19],
               [18, 20, 22],
               [21, 23, 25]],

              [[18, 20, 22],
               [21, 23, 25],
               [24, 26, 28]]])

Dengan demikian, newaxisbukan hanya konversi dari baris ke kolom matriks. Ini meningkatkan dimensi matriks, sehingga memungkinkan kami untuk melakukan lebih banyak operasi di atasnya.


1
Ini bukan hanya matriks, ia bekerja dengan ndarrayterminologi NumPy.
kmario23
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.