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?