2014-11-14 17 views
10

Rất thuận tiện khi sử dụng thuộc tính .T để nhận phiên bản được chuyển đổi của ndarray. Tuy nhiên, không có cách tương tự để có được chuyển vị liên hợp. Lớp ma trận của Numpy có toán tử .H, nhưng không phải ndarray. Bởi vì tôi thích mã có thể đọc được và vì tôi quá lười để luôn viết .conj().T, tôi muốn tài sản .H luôn sẵn sàng cho tôi. Tôi có thể thêm tính năng này bằng cách nào? Có thể thêm nó để nó không có sẵn mỗi khi nhập khẩu không?Toán tử chuyển đổi liên hợp ".H" trong numpy

(Một câu hỏi tương tự có thể bằng cách hỏi về các nhà điều hành .I ngược.)

Trả lời

6

I n chung, khó khăn trong vấn đề này là Numpy là một phần mở rộng C, mà không thể được khỉ vá ... hoặc có thể nó? Các mô-đun forbiddenfruit cho phép một để làm điều này, mặc dù nó cảm thấy một chút giống như chơi với dao.

Vì vậy, đây là những gì tôi đã làm:

  1. Cài đặt rất đơn giản forbiddenfruit gói

  2. Xác định thư mục người dùng tùy biến:

    import site 
    print site.getusersitepackages() 
    
  3. Trong thư mục đó, chỉnh sửa usercustomize.py để bao gồm các mục sau:

    from forbiddenfruit import curse 
    from numpy import ndarray 
    from numpy.linalg import inv 
    curse(ndarray,'H',property(fget=lambda A: A.conj().T)) 
    curse(ndarray,'I',property(fget=lambda A: inv(A))) 
    
  4. thử nghiệm nó:

    python -c python -c "import numpy as np; A = np.array([[1,1j]]); print A; print A.H" 
    

    Kết quả trong:

    [[ 1.+0.j 0.+1.j]] 
    [[ 1.-0.j] 
    [ 0.-1.j]] 
    
8

Bạn có thể phân lớp các đối tượng ndarray như:

from numpy import ndarray 

class myarray(ndarray):  
    @property 
    def H(self): 
     return self.conj().T 

ví dụ rằng:

a = np.random.random((3, 3)).view(myarray) 
a.H 

sẽ cung cấp cho bạn hành vi mong muốn ...

+0

Cảm ơn, nhưng tôi đã hy vọng cho một giải pháp loại khỉ vá nơi tôi vẫn có thể sử dụng ndarray khắp mọi nơi, ví dụ 'A = np.random.randn (3,3) + 1j * np.random.randn (3,3); B = AHdot (A) ' – benpro

+0

@benpro Tôi thấy ... nhưng [điều này sẽ phức tạp hơn] (http://docs.scipy.org/doc/numpy/user/basics.subclassing.html#implications-for- subclassing) –

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