numpy.newaxis ทำงานอย่างไรและใช้งานเมื่อใด?


186

เมื่อฉันลอง

numpy.newaxis

ผลลัพธ์ให้เฟรมพล็อต 2 มิติพร้อมแกน x จาก 0 ถึง 1 อย่างไรก็ตามเมื่อฉันลองใช้numpy.newaxisเพื่อตัดเวกเตอร์

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

มันเป็นสิ่งเดียวกันยกเว้นว่าจะเปลี่ยนเวกเตอร์แถวเป็นเวกเตอร์คอลัมน์หรือไม่

โดยทั่วไปแล้วการใช้คืออะไรnumpy.newaxisและในสถานการณ์ใดที่เราควรใช้


1
except that it changes a row vector to a column vector? ตัวอย่างแรกไม่ใช่เวกเตอร์แถว นั่นเป็นแนวคิดของ MATLAB ในงูหลามมันเป็นเพียงเวกเตอร์ 1 มิติที่ไม่มีแนวคิดของแถวหรือคอลัมน์ เวกเตอร์แถวหรือคอลัมน์เป็น 2-dimensonal เช่นตัวอย่างที่สอง
endolith

คำตอบ:


329

ใส่เพียงแค่numpy.newaxisจะใช้ในการเพิ่มขนาดของอาร์เรย์ที่มีอยู่โดยมิติหนึ่งที่มากขึ้นเมื่อใช้ครั้งเดียว ดังนั้น

  • อาร์เรย์1Dจะกลายเป็นอาร์เรย์2 มิติ

  • อาร์เรย์2 มิติจะกลายเป็นอาร์เรย์3 มิติ

  • อาร์เรย์3Dจะกลายเป็นอาร์เรย์4D

  • อาร์เรย์4Dจะกลายเป็นอาร์เรย์5D

และอื่น ๆ ..

นี่คือภาพประกอบที่แสดงให้เห็นถึงการส่งเสริมการขายของอาร์เรย์ 1D เป็น 2 มิติ

การสร้างภาพข้อมูลใหม่ของ newaxis canva


สถานการณ์-1 : np.newaxisอาจจะมาในประโยชน์เมื่อคุณต้องการอย่างชัดเจนแปลงอาร์เรย์ 1D กับทั้งเวกเตอร์แถวหรือเวกเตอร์คอลัมน์เป็นที่ปรากฎในภาพข้างบน

ตัวอย่าง:

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

สถานการณ์สมมติ -2 : เมื่อเราต้องการใช้ประโยชน์จากการออกอากาศแบบ numpyเป็นส่วนหนึ่งของการดำเนินการบางอย่างเช่นในขณะที่ทำการเพิ่มอาร์เรย์บางตัว

ตัวอย่าง:

สมมติว่าคุณต้องการเพิ่มสองอาร์เรย์ต่อไปนี้:

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

หากคุณพยายามที่จะเพิ่มสิ่งเหล่านี้แบบนั้น NumPy จะเพิ่มสิ่งต่อไปนี้ValueError:

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

ในสถานการณ์นี้คุณสามารถใช้np.newaxisเพื่อเพิ่มมิติของหนึ่งในอาร์เรย์เพื่อให้ NumPy สามารถออกอากาศได้

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

ตอนนี้เพิ่ม:

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

หรือคุณสามารถเพิ่มแกนใหม่ให้กับอาร์เรย์ได้x2:

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

ตอนนี้เพิ่ม:

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

หมายเหตุ : สังเกตว่าเราได้ผลลัพธ์เหมือนกันทั้งสองกรณี (แต่อีกอันหนึ่งเป็นอีกกรณีหนึ่ง)


สถานการณ์ 3 : สิ่งนี้คล้ายกับสถานการณ์ -1 แต่คุณสามารถใช้np.newaxisมากกว่าหนึ่งครั้งเพื่อส่งเสริมอาร์เรย์ให้มีขนาดที่สูงขึ้นได้ บางครั้งการดำเนินการเช่นนี้จำเป็นสำหรับอาร์เรย์คำสั่งซื้อที่สูงขึ้น ( เช่น Tensors )

ตัวอย่าง:

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กับnp.reshape

newaxis ถูกเรียกอีกอย่างว่าเป็นดัชนีเทียมที่อนุญาตให้เพิ่มแกนชั่วคราวลงในมัลติเรย์ได้

np.newaxisใช้ประกอบการหั่นในการสร้างอาร์เรย์ในขณะที่np.reshapeReshapes อาร์เรย์ในรูปแบบที่ต้องการ (สมมติว่ามีขนาดตรงกับ; และนี่คือต้องเป็นreshapeที่จะเกิดขึ้น)

ตัวอย่าง

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)

ในตัวอย่างด้านบนเราได้แทรกแกนชั่วคราวระหว่างแกนที่หนึ่งและสองของB(เพื่อใช้การกระจายเสียง) แกนที่ขาดหายไปถูกเติมเต็มที่นี่np.newaxisเพื่อใช้ในการดำเนินการออกอากาศ


คำแนะนำทั่วไป : คุณสามารถใช้Noneแทนnp.newaxis; เหล่านี้อยู่ในความจริงที่วัตถุเดียวกัน

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

ป.ล. เห็นคำตอบที่ยอดเยี่ยมเช่นnewaxis vs reshape เพื่อเพิ่มส่วนข้อมูล


3
การทำงานประเภทใดคือ x1_new + x2 มันแปลกสำหรับฉันเพราะฉันคิดว่าสองเมทริกซ์สามารถเพิ่มได้ถ้าพวกมันมีขนาดเท่ากัน (หรือถ้าหนึ่งในนั้นเป็นแค่สเกลาร์)
Stephen

2
@ สตีเฟ่นดังที่ฉันได้กล่าวไว้ในคำตอบนั่นเป็นเพราะ NumPy Broadcasting
kmario23

2
นี่เป็นคำอธิบายที่ยอดเยี่ยม
Valdrinium

2
@valdrinit ดีใจที่มีประโยชน์สำหรับคุณ :)
kmario23

1
@ kmario23 แน่นอนว่าการแสดงที่มาถูกซ่อนอยู่ในประโยคสุดท้ายของบทความไม่น่าแปลกใจที่ฉันไม่เห็น ฉันคิดว่ามันเป็นการคัดลอกผลงานถึงแม้ว่าจะมีการระบุแหล่งที่มา ในหนังสือของฉันคำสำหรับการคัดลอกคำเป็นที่ยอมรับก็ต่อเมื่อผู้เขียนคนเดียวกันโพสต์บนแพลตฟอร์มที่แตกต่างกัน ฉันคาดว่าจะดีขึ้นจากปานกลาง
Chiraz BenAbdelkader

29

คือnp.newaxisอะไร

นี่np.newaxisเป็นเพียงนามแฝงสำหรับค่าคงที่ Python Noneซึ่งหมายความว่าทุกที่ที่คุณใช้np.newaxisคุณสามารถใช้None:

>>> np.newaxis is None
True

มันเป็นเพียงมากขึ้นพรรณนาถ้าคุณอ่านรหัสที่ใช้แทนnp.newaxisNone

ใช้np.newaxisอย่างไร?

np.newaxisโดยทั่วไปจะใช้กับหั่น มันบ่งชี้ว่าคุณต้องการเพิ่มมิติเพิ่มเติมให้กับอาร์เรย์ ตำแหน่งของสิ่งnp.newaxisที่ฉันต้องการเพิ่มมิติ

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

ในตัวอย่างแรกฉันใช้องค์ประกอบทั้งหมดจากมิติแรกและเพิ่มมิติที่สอง:

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

ตัวอย่างที่สองเพิ่มมิติเป็นมิติแรกจากนั้นใช้องค์ประกอบทั้งหมดจากมิติแรกของอาร์เรย์เดิมเป็นองค์ประกอบในมิติที่สองของอาร์เรย์ผลลัพธ์:

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

ในทำนองเดียวกันคุณสามารถใช้หลายรายการnp.newaxisเพื่อเพิ่มหลายมิติได้:

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

มีทางเลือกอื่นอีกnp.newaxisหรือเปล่า?

มีฟังก์ชั่นอื่นที่คล้ายกันมากใน NumPy: np.expand_dimsซึ่งสามารถใช้แทรกมิติหนึ่งได้:

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

แต่เนื่องจากมันเพิ่งแทรก1s ในshapeคุณยังสามารถreshapeอาร์เรย์เพื่อเพิ่มมิติเหล่านี้:

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

ส่วนใหญ่แล้วnp.newaxisเป็นวิธีที่ง่ายที่สุดในการเพิ่มส่วนข้อมูล แต่เป็นการดีที่จะรู้ทางเลือกอื่น

ควรใช้เมื่อnp.newaxisใด

ในบริบทหลายอย่างกำลังเพิ่มมิติที่มีประโยชน์:

  • หากข้อมูลควรมีจำนวนมิติที่ระบุ ตัวอย่างเช่นถ้าคุณต้องการที่จะใช้matplotlib.pyplot.imshowเพื่อแสดงอาร์เรย์ 1D

  • ถ้าคุณต้องการ NumPy เพื่อออกอากาศอาร์เรย์ a - a[:, np.newaxis]โดยการเพิ่มมิติตัวอย่างเช่นคุณสามารถได้รับความแตกต่างระหว่างองค์ประกอบทั้งหมดของหนึ่งอาร์เรย์: งานนี้เพราะการดำเนินงาน NumPy ออกอากาศเริ่มต้นด้วยมิติที่ผ่านมา1

  • เมื่อต้องการเพิ่มมิติข้อมูลที่จำเป็นเพื่อให้ NumPy สามารถออกอากาศอาร์เรย์ได้ วิธีนี้ใช้งานได้เนื่องจากแต่ละส่วนของความยาว 1 จะแพร่ภาพไปยังความยาวของ1มิติที่สอดคล้องกันของอาร์เรย์อื่น ๆ


1หากคุณต้องการอ่านเพิ่มเติมเกี่ยวกับกฎการกระจายเสียงเอกสาร NumPy ในหัวเรื่องนั้นดีมาก นอกจากนี้ยังมีตัวอย่างด้วย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 และครั้งที่ 3; พวกเขาทั้งคู่เกี่ยวกับการอนุญาตให้ NumPy ออกอากาศอาร์เรย์เป็นส่วนหนึ่งของการดำเนินการบางอย่าง ถ้าไม่เช่นนั้นจะช่วยเพิ่มตัวอย่างสำหรับกรณีการใช้งานครั้งที่ 3 เพื่อชี้แจงประเด็น
Chiraz BenAbdelkader

@ChirazBenAbdelkader ใช่ความแตกต่างนั้นไม่ชัดเจนจริงๆ ฉันไม่แน่ใจว่าควรลบจุดที่สามหรือรวมเข้าไปในจุดที่สอง
MSeifert

9

คุณเริ่มต้นด้วยรายการตัวเลขหนึ่งมิติ เมื่อคุณใช้numpy.newaxisคุณจะเปลี่ยนมันเป็นเมทริกซ์สองมิติซึ่งประกอบด้วยสี่แถวของแต่ละคอลัมน์

จากนั้นคุณสามารถใช้เมทริกซ์นั้นสำหรับการคูณเมทริกซ์หรือเกี่ยวข้องกับมันในการสร้างเมทริกซ์ขนาดใหญ่ 4 xn


5

newaxisวัตถุใน tuple การเลือกทำหน้าที่ในการขยายขนาดของการเลือกผลลัพธ์ตามมิติความยาวหนึ่งหน่วย

มันไม่ใช่แค่การแปลงเมทริกซ์แถวเป็นเมทริกซ์คอลัมน์

ลองพิจารณาตัวอย่างด้านล่าง:

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

ตอนนี้ให้เพิ่มมิติใหม่ให้กับข้อมูลของเรา

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

              [[4, 5, 6]],

              [[7, 8, 9]]])

คุณจะเห็นว่าnewaxisเพิ่มมิติพิเศษที่นี่ x1 มีมิติ (3,3) และ X1_new มีมิติ (3,1,3)

มิติใหม่ของเราช่วยให้เราสามารถดำเนินการต่าง ๆ ได้อย่างไร:

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 และ x2 เราได้:

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

ดังนั้นnewaxisไม่ใช่แค่การแปลงแถวเป็นเมทริกซ์คอลัมน์ มันเพิ่มมิติของเมทริกซ์ซึ่งทำให้เราสามารถดำเนินการกับมันได้มากขึ้น


1
มันไม่ใช่แค่เมทริกซ์มันใช้ได้กับทุกndarrayคำศัพท์ใน NumPy
kmario23
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.