2010-02-28 26 views
20

Tôi đang tạo một mảng có nhiều mảng được lấp đầy với các đối tượng của một lớp cụ thể mà tôi đã tạo. Tôi muốn khởi tạo mảng như vậy mà nó sẽ chỉ bao giờ chứa các đối tượng của lớp đó. Ví dụ, đây là những gì tôi muốn làm, và những gì sẽ xảy ra nếu tôi làm điều đó.Các kiểu dữ liệu tùy chỉnh trong các mảng có nhiều mảng

class Kernel: 
    pass 

>>> L = np.empty(4,dtype=Kernel) 

TypeError: data type not understood 

tôi có thể làm điều này:

>>> L = np.empty(4,dtype=object) 

và sau đó gán mỗi yếu tố của L như một đối tượng Kernel (hoặc bất kỳ loại khác của đối tượng). Nó sẽ được như vậy gọn gàng là tôi có thể có một mảng của Kernel s, mặc dù, từ cả một điểm lập trình của xem (loại kiểm tra) và một toán học (hoạt động trên bộ chức năng).

Có cách nào để tôi chỉ định loại dữ liệu của một mảng có khối u bằng cách sử dụng một lớp tùy ý không?

Trả lời

18

Nếu lớp Kernel của bạn có số lượng dữ liệu thành viên dự đoán, thì bạn có thể xác định loại dtype cho nó thay vì một lớp. ví dụ. nếu nó tham số 9 phao nổi và một int, bạn có thể làm

kerneldt = np.dtype([('myintname', np.int32), ('myfloats', np.float64, 9)]) 
arr = np.empty(dims, dtype=kerneldt) 

Bạn sẽ phải làm một số cưỡng chế để biến chúng thành đối tượng của lớp Kernel mỗi khi bạn muốn thao tác phương pháp của một hạt nhân duy nhất nhưng đó là một cách để lưu trữ dữ liệu thực tế trong một mảng NumPy. Nếu bạn muốn chỉ lưu trữ một tham chiếu, thì đối tượng dtype là tốt nhất bạn có thể làm mà không cần phân lớp ndarray.

+0

Đây là những gì tôi đang tìm kiếm! Mặc dù tôi bắt đầu nghĩ rằng đó là công việc nhiều hơn nó có giá trị ... Sẽ đọc trên np.dtype. –

1

Theo như tôi biết, thực thi một loại duy nhất cho các yếu tố trong a numpy.ndarray phải được thực hiện thủ công (trừ khi mảng chứa các scalars Numpy): không có cơ chế kiểm tra tích hợp (mảng của bạn có dtype = object). Nếu bạn thực sự muốn thực thi một kiểu duy nhất, bạn phải phân lớp ndarray và thực hiện kiểm tra theo các phương thức thích hợp (__setitem__, v.v.).

Nếu bạn muốn thực hiện các thao tác trên một tập hợp các hàm (đối tượng Kernel), bạn có thể làm như vậy bằng cách xác định các hoạt động thích hợp trực tiếp trong lớp Kernel của bạn. Đây là những gì tôi đã làm cho mô-đun uncertainties.py của tôi, xử lý các kết quả của các số không chắc chắn.

Các vấn đề liên quan