Basitçe söylemek gerekirse, numpy.newaxis
için kullanılan bir boyut artırmak , mevcut dizinin bir daha boyuta kullanıldığında, bir zamanlar . Böylece,
ve bunun gibi..
1D dizisinin 2D dizilere tanıtımını gösteren görsel bir çizim .
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.newaxis
istediğ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.newaxis
NumPy'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.newaxis
birden ç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.newaxis
np.reshape
diziyi 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.newaxis
için burada eksik bir eksen doldurulur .
Genel İpucu : BununNone
yerinenp.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
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