ใส่เพียงแค่numpy.newaxis
จะใช้ในการเพิ่มขนาดของอาร์เรย์ที่มีอยู่โดยมิติหนึ่งที่มากขึ้นเมื่อใช้ครั้งเดียว ดังนั้น
อาร์เรย์1Dจะกลายเป็นอาร์เรย์2 มิติ
อาร์เรย์2 มิติจะกลายเป็นอาร์เรย์3 มิติ
อาร์เรย์3Dจะกลายเป็นอาร์เรย์4D
อาร์เรย์4Dจะกลายเป็นอาร์เรย์5D
และอื่น ๆ ..
นี่คือภาพประกอบที่แสดงให้เห็นถึงการส่งเสริมการขายของอาร์เรย์ 1D เป็น 2 มิติ
สถานการณ์-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.reshape
Reshapes อาร์เรย์ในรูปแบบที่ต้องการ (สมมติว่ามีขนาดตรงกับ; และนี่คือต้องเป็น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 เพื่อเพิ่มส่วนข้อมูล
except that it changes a row vector to a column vector?
ตัวอย่างแรกไม่ใช่เวกเตอร์แถว นั่นเป็นแนวคิดของ MATLAB ในงูหลามมันเป็นเพียงเวกเตอร์ 1 มิติที่ไม่มีแนวคิดของแถวหรือคอลัมน์ เวกเตอร์แถวหรือคอลัมน์เป็น 2-dimensonal เช่นตัวอย่างที่สอง