2012-05-04 13 views
5

Tôi đang cố gắng phân loại lớp học ndarray của lớp học numpy và đã có một số may mắn. Các hành vi mà tôi muốn là gần như chính xác giống như example được đưa ra trong tài liệu. Tôi muốn thêm một tham số name vào mảng (mà tôi sử dụng để theo dõi dữ liệu ban đầu đến từ đâu).Giữ một phân lớp ndarray numpy là giá trị trả về trong quá trình chuyển đổi. An toàn để đặt __array_priority__?

class Template(np.ndarray): 
    """A subclass of numpy's n dimensional array that allows for a 
    reference back to the name of the template it came from. 
    """ 
    def __new__(cls, input_array, name=None): 
     obj = np.asarray(input_array).view(cls) 
     obj.name = name 
     return obj 

    def __array_finalize__(self, obj): 
     if obj is None: return 
     self.name = getattr(obj, 'name', None) 

này hoạt động, ngoại trừ rằng, giống như this question, Tôi muốn bất kỳ sự biến đổi liên quan đến lớp con tôi quay trở lại trường hợp khác của lớp con tôi.

chức năng Đôi khi NumPy làm trở lại một thể hiện của Template:

>>> a = Template(np.array([[1,2,3], [2,4,6]], name='from here') 
>>> np.dot(a, np.array([[1,0,0],[0,1,0],[0,0,1]])) 
Template([[1, 2, 3], 
     [2, 4, 6]]) 

Tuy nhiên, đôi khi họ không:

>>> np.dot(np.array([[1,0],[0,1]]), a) 
array([[1, 2, 3], 
     [2, 4, 6]]) 

Trong câu hỏi tôi có liên quan đến ở trên, có ý kiến ​​cho rằng OP nên ghi đè lên phương thức __wrap_array__ cho lớp con. Tuy nhiên, tôi không thấy bất kỳ lý do nào trong việc này. Trong một số trường hợp, tôi nhận được hành vi mong đợi của mình với mặc định __array_wrap__. The docs dường như cho thấy rằng tôi đang chạy vào một tình huống mà đó là lập luận khác của phương pháp __array_wrap__ được gọi vì một __array_priority__ giá trị cao hơn:

Lưu ý rằng ufunc (np.add) đã kêu gọi các phương pháp __array_wrap__ của đầu vào với giá trị cao nhất __array_priority__

Vì vậy, câu hỏi của tôi có một vài phần liên quan. Trước tiên: tôi có thể đặt thuộc tính __array_priority__ của lớp con của mình sao cho nó __array_wrap__ sẽ luôn được gọi? Thứ hai: Đây có phải là cách tốt nhất/dễ nhất để đạt được hành vi mong muốn của tôi không?

Trả lời

0

Khi hai đối tượng có __array_priority__ cùng:

>>> np.array([[1,0],[0,1]]).__array_priority__ 
0.0 
>>> a.__array_priority__ 
0.0 

Và chỉ phương pháp một đối tượng có thể được sử dụng, cà vạt được giải quyết bằng cách sử dụng phương pháp mảng đầu tiên của/đối tượng. (Trong trường hợp của bạn __array_wrap__)

Từ câu hỏi, có vẻ như phương pháp của lớp học của bạn luôn được ưu tiên vì chúng giống nhau (thông qua kế thừa) hoặc ghi đè.

Vì vậy, tôi sẽ chỉ xoay vòng __array_priority__.

class Template(np.ndarray): 
    __array_priority__ = 1.0 (Or whichever value is high enough) 
    ... 

Sau khi bạn thực hiện việc này bất kể đối tượng mẫu đang được tính toán ở đâu. Đó là phương pháp sẽ được ưa thích hơn phương pháp mảng tiêu chuẩn.

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