Lớp Python trả về mảng
Phân lớp ndarray tương đối đơn giản, nhưng nó có một số phức tạp so với các đối tượng Python khác. Trên trang này, chúng tôi giải thích cơ chế cho phép bạn phân lớp ndarray và ý nghĩa của việc triển khai phân lớp Show
ndarrays và tạo đối tượngViệc phân lớp ndarray phức tạp bởi thực tế là các thể hiện mới của các lớp ndarray có thể xuất hiện theo ba cách khác nhau. đó là
Hai cái cuối cùng là đặc điểm của ndarrays - để hỗ trợ những thứ như cắt mảng. Sự phức tạp của việc phân lớp ndarray là do cơ chế numpy phải hỗ trợ hai lộ trình tạo cá thể sau này Khi nào sử dụng phân lớpBên cạnh sự phức tạp bổ sung của việc phân lớp con một mảng NumPy, các lớp con có thể gặp phải hành vi không mong muốn vì một số hàm có thể chuyển đổi lớp con thành lớp cơ sở và “quên” bất kỳ thông tin bổ sung nào liên quan đến lớp con. Điều này có thể dẫn đến hành vi đáng ngạc nhiên nếu bạn sử dụng các phương thức hoặc hàm NumPy mà bạn chưa kiểm tra rõ ràng Mặt khác, so với các cách tiếp cận khả năng tương tác khác, phân lớp có thể hữu ích vì nhiều thứ sẽ “hoạt động bình thường” Điều này có nghĩa là phân lớp có thể là một cách tiếp cận thuận tiện và trong một thời gian dài nó cũng thường là cách tiếp cận khả dụng duy nhất. Tuy nhiên, NumPy hiện cung cấp các giao thức tương tác bổ sung được mô tả trong “”. Đối với nhiều trường hợp sử dụng, các giao thức tương tác này giờ đây có thể phù hợp hơn hoặc bổ sung cho việc sử dụng phân lớp Phân lớp có thể phù hợp nếu
Lưu ý rằng các tác giả phân lớp cũng có thể muốn nghiên cứu để hỗ trợ các trường hợp sử dụng phức tạp hơn hoặc giải quyết hành vi đáng ngạc nhiên >>> class C: >>> def __new__(cls, *args): >>> print('Cls in __new__:', cls) >>> print('Args in __new__:', args) >>> # The `object` type __new__ method takes a single argument. >>> return object.__new__(cls) >>> def __init__(self, *args): >>> print('type(self) in __init__:', type(self)) >>> print('Args in __init__:', args)7 và >>> class C: >>> def __new__(cls, *args): >>> print('Cls in __new__:', cls) >>> print('Args in __new__:', args) >>> # The `object` type __new__ method takes a single argument. >>> return object.__new__(cls) >>> def __init__(self, *args): >>> print('type(self) in __init__:', type(self)) >>> print('Args in __init__:', args)8 là những ví dụ cho các đối tượng dạng mảng tương tác tốt với NumPy. Astropy's >>> class C: >>> def __new__(cls, *args): >>> print('Cls in __new__:', cls) >>> print('Args in __new__:', args) >>> # The `object` type __new__ method takes a single argument. >>> return object.__new__(cls) >>> def __init__(self, *args): >>> print('type(self) in __init__:', type(self)) >>> print('Args in __init__:', args)9 là một ví dụ sử dụng cách tiếp cận kép của cả giao thức phân lớp và khả năng tương tác Xem đúcTruyền dạng xem là cơ chế ndarray tiêu chuẩn theo đó bạn lấy một ndarray của bất kỳ lớp con nào và trả về dạng xem của mảng dưới dạng một lớp con (được chỉ định) khác >>> import numpy as np >>> # create a completely useless ndarray subclass >>> class C(np.ndarray): pass >>> # create a standard ndarray >>> arr = np.zeros((3,)) >>> # take a view of it, as our useless subclass >>> c_arr = arr.view(C) >>> type(c_arr) Tạo mới từ mẫuCác phiên bản mới của một lớp con ndarray cũng có thể xuất hiện theo một cơ chế rất giống với , khi numpy nhận thấy nó cần tạo một phiên bản mới từ một phiên bản mẫu. Vị trí rõ ràng nhất mà điều này phải xảy ra là khi bạn đang lấy các mảng được phân lớp. Ví dụ >>> v = c_arr[1:] >>> type(v) # the view is of type 'C' Slice là một chế độ xem trên dữ liệu gốc của >>> c = C('hello') Cls in __new__:0. Vì vậy, khi chúng tôi xem từ ndarray, chúng tôi trả về một ndarray mới, cùng loại, trỏ đến dữ liệu trong bản gốc Có những điểm khác trong việc sử dụng ndarrays mà chúng ta cần các chế độ xem như vậy, chẳng hạn như sao chép mảng ( >>> c = C('hello') Cls in __new__:1), tạo mảng đầu ra ufunc (xem thêm) và các phương thức rút gọn (như >>> c = C('hello') Cls in __new__:2) Mối quan hệ của truyền dạng xem và mẫu mới từ mẫuCả hai con đường này đều sử dụng cùng một máy móc. Chúng tôi tạo ra sự khác biệt ở đây, bởi vì chúng dẫn đến đầu vào khác nhau cho các phương pháp của bạn. Cụ thể, có nghĩa là bạn đã tạo một thể hiện mới của kiểu mảng của mình từ bất kỳ lớp con tiềm năng nào của ndarray. có nghĩa là bạn đã tạo một thể hiện mới của lớp của mình từ một thể hiện có sẵn, cho phép bạn - ví dụ - sao chép qua các thuộc tính dành riêng cho lớp con của bạn Ý nghĩa đối với phân lớpNếu chúng ta phân lớp ndarray, chúng ta không chỉ cần giải quyết việc xây dựng rõ ràng kiểu mảng của chúng ta, mà còn hoặc. NumPy có máy móc để làm điều này và chính máy móc này làm cho việc phân lớp con hơi phi tiêu chuẩn Có hai khía cạnh đối với bộ máy mà ndarray sử dụng để hỗ trợ chế độ xem và mẫu mới từ mẫu trong các lớp con Đầu tiên là việc sử dụng phương thức ________ 73 cho công việc chính là khởi tạo đối tượng, sau đó là phương thức ________ 74 thông thường hơn. Thứ hai là việc sử dụng phương thức >>> c = C('hello') Cls in __new__:5 để cho phép các lớp con dọn dẹp sau khi tạo các khung nhìn và các thể hiện mới từ các mẫu Sơ lược về Python ngắn gọn về >>> c = C('hello')
Cls in __new__: |