สิ่งนี้เกิดขึ้นใน คุณสมบัติที่ซ่อนของ Pythonแต่ฉันไม่เห็นเอกสารหรือตัวอย่างที่ดีที่อธิบายการทำงานของคุณลักษณะ
สิ่งนี้เกิดขึ้นใน คุณสมบัติที่ซ่อนของ Pythonแต่ฉันไม่เห็นเอกสารหรือตัวอย่างที่ดีที่อธิบายการทำงานของคุณลักษณะ
คำตอบ:
Ellipsis
หรือ...
ไม่ใช่คุณสมบัติที่ซ่อนอยู่มันเป็นค่าคงที่ มันค่อนข้างแตกต่างกับพูด javascript ES6 ซึ่งเป็นส่วนหนึ่งของไวยากรณ์ภาษา ไม่มีคลาสบิวอินหรือภาษางูหลามใช้ประโยชน์จากมัน
ดังนั้นไวยากรณ์ของมันจึงขึ้นอยู่กับคุณทั้งหมดหรือคนอื่นโดยการเขียนโค้ดเพื่อทำความเข้าใจ
Numpy ใช้มันตามที่ระบุไว้ในเอกสาร ตัวอย่างบางส่วนที่นี่
ในชั้นเรียนของคุณคุณจะใช้มันในลักษณะนี้:
>>> class TestEllipsis(object):
... def __getitem__(self, item):
... if item is Ellipsis:
... return "Returning all items"
... else:
... return "return %r items" % item
...
>>> x = TestEllipsis()
>>> print x[2]
return 2 items
>>> print x[...]
Returning all items
แน่นอนว่ายังมีเป็นเอกสารหลามและอ้างอิงภาษา แต่สิ่งเหล่านั้นไม่ค่อยเป็นประโยชน์
จุดไข่ปลาจะใช้ในการ numpy เพื่อแบ่งโครงสร้างข้อมูลมิติที่สูงขึ้น
มันออกแบบมาเพื่อหมายถึงณ จุดนี้ใส่เป็นชิ้นเต็มรูปแบบจำนวนมาก ( :
) เพื่อขยายชิ้นหลายมิติไปยังทุกมิติ
ตัวอย่าง :
>>> from numpy import arange
>>> a = arange(16).reshape(2,2,2,2)
ตอนนี้คุณมีเมทริกซ์ 4 มิติเรียง 2x2x2x2 ในการเลือกองค์ประกอบแรกทั้งหมดในมิติที่ 4 คุณสามารถใช้เครื่องหมายจุดไข่ปลา
>>> a[..., 0].flatten()
array([ 0, 2, 4, 6, 8, 10, 12, 14])
ซึ่งเทียบเท่ากับ
>>> a[:,:,:,0].flatten()
array([ 0, 2, 4, 6, 8, 10, 12, 14])
ในการติดตั้งใช้งานของคุณเองคุณมีอิสระที่จะเพิกเฉยต่อสัญญาที่กล่าวถึงข้างต้นและใช้สำหรับสิ่งที่คุณเห็นว่าเหมาะสม
a[:,:,:,0]
จะส่งคืนสำเนาและa[...,0]
จะส่งคืน "มุมมอง" และไม่ใช่สำเนาหรือ ฉันพยายามวิ่งid()
กับทั้งสองเวอร์ชันและสำหรับอาเรย์ 3 มิติ: a[:,:,:, 0], a[:,:,:, 1], a[:,:,:, 2]
ทั้งหมดมีรหัสที่แตกต่างกันในขณะที่: a[..., 0], a[..., 1], a[..., 2]
ทั้งหมดมีรหัสเดียวกัน
id()
ส่งคืนค่าเดียวกันสำหรับทั้งคู่ ตรวจสอบด้วย__array_interface__['data']
แสดงที่อยู่หน่วยความจำเดียวกัน
a[indexes, ...]
ในขณะที่ a เป็นอาร์เรย์ 1 มิติได้!
นี่คือการใช้งานอื่นสำหรับ Ellipsis ซึ่งไม่มีส่วนเกี่ยวข้องกับชิ้น: ฉันมักจะใช้มันในการสื่อสารภายในเธรดกับคิวเป็นเครื่องหมายที่ส่งสัญญาณว่า "เสร็จสิ้น"; มันคือวัตถุมันเป็นซิงเกิลตันและชื่อของมันหมายถึง "ขาด" และไม่ใช่ None ที่มากเกินไป (ซึ่งสามารถใส่ในคิวเป็นส่วนหนึ่งของการไหลของข้อมูลปกติ) YMMV
ตามที่ระบุไว้ในคำตอบอื่น ๆ มันสามารถใช้สำหรับการสร้างชิ้น มีประโยชน์เมื่อคุณไม่ต้องการเขียนเครื่องหมายเต็ม ๆ หลายชิ้น ( :
) หรือเมื่อคุณไม่แน่ใจว่ามิติข้อมูลของอาเรย์นั้นถูกจัดการอย่างไร
สิ่งที่ฉันคิดว่าสำคัญที่จะเน้นและที่ขาดหายไปกับคำตอบอื่น ๆ ก็คือมันสามารถใช้งานได้แม้ว่าจะไม่มีมิติที่จะเติมอีก
ตัวอย่าง:
>>> from numpy import arange
>>> a = arange(4).reshape(2,2)
สิ่งนี้จะทำให้เกิดข้อผิดพลาด:
>>> a[:,0,:]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: too many indices for array
สิ่งนี้จะได้ผล:
a[...,0,:]
array([0, 1])