Điều này xuất hiện trong các tính năng ẩn của Python , nhưng tôi không thể thấy tài liệu hay ví dụ giải thích cách thức hoạt động của tính năng này.
Điều này xuất hiện trong các tính năng ẩn của Python , nhưng tôi không thể thấy tài liệu hay ví dụ giải thích cách thức hoạt động của tính năng này.
Câu trả lời:
Ellipsis
hoặc ...
không phải là một tính năng ẩn, nó chỉ là một hằng số. Nó khá khác với, ví dụ, javascript ES6, đây là một phần của cú pháp ngôn ngữ. Không có lớp dựng sẵn hoặc cấu trúc ngôn ngữ Python nào sử dụng nó.
Vì vậy, cú pháp cho nó phụ thuộc hoàn toàn vào bạn, hoặc người khác, có mã viết để hiểu nó.
Numpy sử dụng nó, như đã nêu trong tài liệu . Một số ví dụ ở đây .
Trong lớp của riêng bạn, bạn sẽ sử dụng nó như thế này:
>>> 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
Tất nhiên, có tài liệu python , và tài liệu tham khảo ngôn ngữ . Nhưng những điều đó không hữu ích lắm.
Dấu chấm lửng được sử dụng trong numpy để cắt các cấu trúc dữ liệu chiều cao hơn.
Tại thời điểm này,:
nó được thiết kế để chèn nhiều lát ( ) đầy đủ để mở rộng lát cắt đa chiều cho tất cả các kích thước .
Ví dụ :
>>> from numpy import arange
>>> a = arange(16).reshape(2,2,2,2)
Bây giờ, bạn có một ma trận 4 chiều có thứ tự 2x2x2x2. Để chọn tất cả các yếu tố đầu tiên trong chiều thứ 4, bạn có thể sử dụng ký hiệu dấu chấm lửng
>>> a[..., 0].flatten()
array([ 0, 2, 4, 6, 8, 10, 12, 14])
tương đương với
>>> a[:,:,:,0].flatten()
array([ 0, 2, 4, 6, 8, 10, 12, 14])
Trong các triển khai của riêng bạn, bạn có thể bỏ qua hợp đồng được đề cập ở trên và sử dụng nó cho bất cứ điều gì bạn thấy phù hợp.
a[:,:,:,0]
sẽ trả lại một bản sao và a[...,0]
sẽ trả lại "lượt xem" chứ không phải bản sao? Tôi đã thử chạy id()
với cả hai phiên bản và cho mảng 3 mờ: a[:,:,:, 0], a[:,:,:, 1], a[:,:,:, 2]
tất cả đều có id khác nhau trong khi: a[..., 0], a[..., 1], a[..., 2]
tất cả đều có cùng id.
id()
trả về cùng một giá trị cho cả hai. Cũng kiểm tra với __array_interface__['data']
hiển thị cùng một địa chỉ bộ nhớ.
a[indexes, ...]
trong khi a là mảng 1 chiều!
Đây là một cách sử dụng khác cho Ellipsis, không liên quan gì đến các lát: Tôi thường sử dụng nó trong giao tiếp nội bộ với hàng đợi, như một dấu hiệu báo hiệu "Xong"; nó ở đó, nó là một vật thể, nó là một con đơn và tên của nó có nghĩa là "thiếu" và nó không phải là Không được sử dụng quá mức (có thể được xếp vào hàng đợi như một phần của luồng dữ liệu thông thường). YMMV.
Như đã nêu trong các câu trả lời khác, nó có thể được sử dụng để tạo các lát. Hữu ích khi bạn không muốn viết nhiều ký hiệu lát ( :
) hoặc khi bạn không chắc chắn về chiều của mảng đang được thao tác.
Điều tôi nghĩ quan trọng cần làm nổi bật, và điều còn thiếu ở các câu trả lời khác, là nó có thể được sử dụng ngay cả khi không có thêm kích thước nào để điền vào.
Thí dụ:
>>> from numpy import arange
>>> a = arange(4).reshape(2,2)
Điều này sẽ dẫn đến lỗi:
>>> a[:,0,:]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: too many indices for array
Điều này sẽ làm việc:
a[...,0,:]
array([0, 1])