Numpy.newaxis nasıl çalışır ve ne zaman kullanılır?


187

Denediğimde

numpy.newaxis

sonuç bana 0'dan 1'e x ekseni olan 2 boyutlu bir çizim çerçevesi verir. Ancak, numpy.newaxisbir vektörü dilimlemeye çalıştığımda ,

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

Bir satır vektörünü sütun vektörüne dönüştürmesi dışında aynı şey midir?

Genel olarak kullanımı nedir numpy.newaxisve hangi durumlarda kullanmalıyız?


1
except that it changes a row vector to a column vector? İlk örnek bir satır vektörü değildir. Bu bir matlab konsepti. Python'da satır veya sütun kavramı olmayan sadece 1 boyutlu bir vektör. Satır veya sütun vektörleri, ikinci örnek gibi 2-dimensonaldır
endolit

Yanıtlar:


333

Basitçe söylemek gerekirse, numpy.newaxisiçin kullanılan bir boyut artırmak , mevcut dizinin bir daha boyuta kullanıldığında, bir zamanlar . Böylece,

  • 1D dizisi 2D dizisi olacak

  • 2D dizi 3D dizi olacak

  • 3D dizi 4D dizisi olacak

  • 4D dizisi 5D dizisi olacak

ve bunun gibi..

1D dizisinin 2D dizilere tanıtımını gösteren görsel bir çizim .

newaxis canva görselleştirme


Senaryo-1 : Bir 1D dizisini yukarıdaki resimde gösterildiği gibi bir satır vektörüne veya bir sütun vektörüne açıkça dönüştürmek np.newaxisistediğinizde kullanışlı olabilir .

Misal:

# 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)

Senaryo-2 : Biz faydalanmak istediğinizde numpy yayın yaparken, örneğin bazı operasyonu kapsamında eklenmesini bazı dizilerin.

Misal:

Aşağıdaki iki diziyi eklemek istediğinizi varsayalım:

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

Bunları böyle eklemeye çalışırsanız, NumPy aşağıdakileri yükseltir ValueError:

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

Bu durumda, np.newaxisNumPy'nin yayın yapabilmesi için dizilerden birinin boyutunu artırmak için kullanabilirsiniz .

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

Şimdi ekleyin:

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

Alternatif olarak, diziye yeni eksen de ekleyebilirsiniz x2:

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

Şimdi ekleyin:

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

Not : Her iki durumda da aynı sonucu aldığımızı gözlemleyin (ancak biri diğerinin aktarımıdır).


Senaryo-3 : Bu senaryo-1'e benzer. Ancak, diziyi daha yüksek boyutlara yükseltmek için np.newaxisbirden çok kez kullanabilirsiniz . Böyle bir işlem bazen daha yüksek mertebeden diziler için ( yani Tensörler ) gereklidir .

Misal:

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)

Np.newaxis vs np.reshape hakkında daha fazla arka plan

newaxis aynı zamanda, bir eksenin çokdizime geçici olarak eklenmesine izin veren bir sahte dizin olarak da adlandırılır.

np.newaxisnp.reshapediziyi istenen düzene yeniden şekillendirirken diziyi yeniden oluşturmak için dilimleme operatörünü kullanır (boyutların eşleştiği varsayılarak; ve bunun olması için gereklidirreshape ).

Misal

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)

Yukarıdaki örnekte, B(yayını kullanmak için) birinci ve ikinci eksenleri arasına geçici bir eksen ekledik . Yayın işleminin çalışması np.newaxisiçin burada eksik bir eksen doldurulur .


Genel İpucu : BununNoneyerinenp.newaxis; Bunlar aslında aynı nesneler .

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

PS Ayrıca bu harika cevaba bakınız: newaxis vs yeniden boyut eklemek


3
X1_new + x2 ne tür bir işlemdir? Benim için garip çünkü iki matrisin sadece aynı boyutlara sahip olmaları (veya bunlardan biri aslında sadece bir skaler ise) eklenebileceğini düşündüm.
Stephen

2
@Stephen Yanıtta da belirttiğim gibi, bunun nedeni NumPy Broadcasting.
kmario23

2
Bu harika bir açıklama
Valdrinium

2
@valdrinit sizin için yararlı olduğuna sevindim :)
kmario23

1
@ kmario23 Gerçekten atıf, makalenin son cümlesinde gizlidir, görmediğime şaşmamalı. Bu atıfta bile sınırda intihal olduğunu düşünüyorum. Kitabımda, kelime kopyalama kelimesi yalnızca aynı yazarın farklı platformlarda yayınlaması durumunda kabul edilebilir. Medium'dan daha iyisini bekliyordum.
Chiraz BenAbdelkader

29

Nedir np.newaxis?

Bu np.newaxissadece Python sabiti için bir takma addır None, yani her nerede kullanırsanız np.newaxiskullanın None:

>>> np.newaxis is None
True

Bunun yerine kullanılan kodu okursanız daha açıklayıcı olur .np.newaxisNone

Nasıl kullanılır np.newaxis?

np.newaxisGenellikle dilimleme ile birlikte kullanılır. Diziye ek bir boyut eklemek istediğinizi gösterir. np.newaxisBoyutları eklemek istediğim yerde temsilin konumu .

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

İlk örnekte birinci boyuttaki tüm öğeleri kullanıyorum ve ikinci bir boyut ekliyorum:

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

İkinci örnek, ilk boyut olarak bir boyut ekler ve ardından orijinal dizinin ilk boyutundaki tüm öğeleri sonuç dizisinin ikinci boyutundaki öğeler olarak kullanır:

>>> 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)

Benzer şekilde, birden np.newaxisçok boyut eklemek için birden çok kullanabilirsiniz :

>>> 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)

Alternatifleri var mı np.newaxis?

NumPy'de np.expand_dimsbir boyut eklemek için de kullanılabilecek çok benzer bir işlevsellik daha var :

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

Ama sadece ekler göz önüne alındığında 1s shapeda olabilir reshapedizisi bu boyutları eklemek için:

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

Çoğu zaman np.newaxisboyut eklemenin en kolay yoludur, ancak alternatifleri bilmek iyidir.

Ne zaman kullanılır np.newaxis?

Birkaç bağlamda yararlı boyutlar eklemektir:

  • Verilerin belirtilen sayıda boyutu olması gerekiyorsa. Örneğin matplotlib.pyplot.imshow, 1D dizisini görüntülemek için kullanmak isterseniz .

  • NumPy'nin dizileri yayınlamasını istiyorsanız. Bir boyut ekleyerek örneğin bir dizinin tüm elemanları arasındaki farkı alabilir: a - a[:, np.newaxis]. Bu çalışır, çünkü NumPy işlemleri son boyut 1'den başlayarak yayın yapar .

  • NumPy böylece gerekli boyut eklemek için olabilir diziler yayın. Bu, her uzunluk-1 boyutu diğer dizinin karşılık gelen 1 boyutunun uzunluğuna yayınlandığı için çalışır .


1 Yayın kuralları hakkında daha fazla bilgi almak isterseniz , bu konudaki NumPy belgeleri çok iyidir. Ayrıca aşağıdakileri içeren bir örnek içerir 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.]])

2. ve 3. kullanım durumları arasındaki farkı görmüyorum; ikisi de NumPy'nin bir işlemin bir parçası olarak bir dizi yayınlamasına izin vermekle ilgilidir. Değilse, noktayı netleştirmek için 3. kullanım durumu için bir örnek eklemek yardımcı olacaktır.
Chiraz BenAbdelkader

@ChirazBenAbdelkader Evet, ayrım gerçekten o kadar da farklı değil. Üçüncü noktayı kaldırmalı mıyım yoksa ikinci noktayla mı birleştirmem gerektiğinden emin değilim.
MSeifert

9

Tek boyutlu bir numara listesi ile başladınız. Bir kez kullandıktan sonra numpy.newaxis, her biri bir sütundan oluşan dört sıradan oluşan iki boyutlu bir matrise dönüştürdünüz.

Daha sonra bu matrisi matris çarpımı için kullanabilir veya daha büyük bir 4 xn matrisin yapımına dahil edebilirsiniz.


5

newaxisseçim grubundaki nesne , elde edilen seçimin boyutlarını bir birim uzunluklu boyutla genişletmeye yarar .

Sadece satır matrisini sütun matrisine dönüştürmek değildir.

Aşağıdaki örneği düşünün:

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

Şimdi verilerimize yeni bir boyut ekleyelim,

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

              [[4, 5, 6]],

              [[7, 8, 9]]])

Bunu görebilirsiniz newaxisburada fazladan bir boyut eklendi, x1 boyut (3,3) vardı ve X1_new boyut (3,1,3) sahiptir.

Yeni boyutumuzun farklı operasyonları gerçekleştirmemize nasıl sağladığı:

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

X1_new ve x2 ekleyerek şunu elde ederiz:

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]]])

Dolayısıyla, newaxissadece satırın sütun matrisine dönüştürülmesi değildir. Matrisin boyutunu arttırır, böylece üzerinde daha fazla işlem yapmamızı sağlar.


1
Sadece matris değil ndarray, NumPy terminolojisindeki herhangi biriyle çalışır .
kmario23
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.