Numpy: ฉันควรใช้ newaxis หรือ None?


92

ในจำนวนหนึ่งสามารถใช้อ็อบเจ็กต์ 'newaxis' ในไวยากรณ์การแบ่งส่วนเพื่อสร้างแกนที่มีความยาวได้เช่น:

import numpy as np
print np.zeros((3,5))[:,np.newaxis,:].shape
# shape will be (3,1,5)

รัฐเอกสารที่หนึ่งยังสามารถใช้Noneแทนnewaxisผลที่ออกมาจะตรงเดียวกัน

มีเหตุผลอะไรที่ต้องเลือกอย่างใดอย่างหนึ่ง? มีคำแนะนำทั่วไปหรือสไตล์หรือไม่? ความประทับใจของฉันคือnewaxisได้รับความนิยมมากขึ้นอาจเป็นเพราะมีความชัดเจนมากกว่า มีเหตุผลใดNoneบ้างที่อนุญาต?

คำตอบ:


104

Noneที่ได้รับอนุญาตเพราะเป็นเพียงนามแฝงสำหรับnumpy.newaxisNone

In [1]: import numpy

In [2]: numpy.newaxis is None
Out[2]: True

ผู้เขียนอาจเลือกเพราะต้องการค่าคงที่ที่สะดวกและNoneพร้อมใช้งาน

สำหรับเหตุผลที่คุณควรต้องการnewaxisมากกว่าNone: ส่วนใหญ่จะเป็นเพราะมันเป็นที่ชัดเจนมากขึ้นและส่วนหนึ่งเป็นเพราะสักวันหนึ่งผู้เขียนอาจจะเปลี่ยนเป็นอย่างอื่นที่ไม่ใช่numpy None(พวกเขาไม่ได้วางแผนที่จะทำและอาจจะไม่ทำ แต่ก็ไม่มีเหตุผลที่ดีที่จะชอบNone)


ขอบคุณฉันไม่ได้สังเกตว่า np.newaxis นั้นไม่มีอยู่จริง ฉันจะไปกับ newaxis แล้ว
nikow

7
จริงๆแล้วพวกเขาบอกว่าคุณสามารถใช้ None ได้ดังนั้นจึงไม่สามารถเปลี่ยนแปลงได้ในตอนนี้: "อ็อบเจ็กต์ newaxis สามารถใช้ในไวยากรณ์การแบ่งส่วนพื้นฐานที่กล่าวถึงข้างต้นได้และไม่สามารถใช้แทน newaxis ได้"
endolith

5
นอกจากนี้หากคุณทำงานกับคนที่ไม่คุ้นเคยกับรายละเอียดของการจัดทำดัชนีที่เป็นตัวเลขพวกเขาดูเหมือนจะบ้าคลั่งเมื่อเห็นอาร์เรย์ที่ "ไม่มีการอ้างอิง"
ปีเตอร์

1
สถานที่หนึ่งที่Noneดีกว่าคือการเพิ่มประสิทธิภาพความเร็วในการดำเนินการซึ่งสามารถให้ประโยชน์ด้านเวลาเพียงเล็กน้อย np.newaxisแต่โดยปกติคุณจะชอบ
godaygo

2
ทำไมพวกเขาถึงไม่ใช้newaxis = object()(หรือเทียบเท่าระดับ C) อยู่นอกเหนือจากฉัน ... การใช้Noneค่อนข้างผิดพลาดได้ง่าย ฉันมีฟังก์ชั่นที่มีจุดบกพร่อง (เปล่าreturnที่ควรจะส่งคืนอาร์เรย์บูลีน) และฉันเริ่มได้รับข้อผิดพลาดเนื่องจากรูปร่างไม่ตรงกัน ฉันใช้เวลาสักพักกว่าจะรู้ว่าการสร้างดัชนีด้วยNoneไม่เพียงแค่เพิ่มIndexErrorไฟล์. หากพวกเขาใช้ค่า Sentinel "สด" ฉันจะหลีกเลี่ยง 30 นาทีในการพยายามทำความเข้าใจกับข้อผิดพลาด ...
Giacomo Alzetta
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.