2012-06-09 28 views
2

我想寫M.det(),而不是numpy.linalg.det(M), 所以我這樣做:添加`numpy.linalg.det`的方法`numpy.matrix`

numpy.matrix.det = numpy.linalg.det

和它的工作。

對此訴訟有什麼要說的嗎?


實施例:

import numpy as np 
np.matrix.det = np.linalg.det 
M = np.matrix([[1,2],[3,4]]) 
print M.det() 

正確的輸出:-2.0

回答

1

這被稱爲monkey patching。它可能適用於這種特殊情況,但由於det方法僅存在於程序中,並且沒有記錄在任何位置,因此它會使程序難以遵循。此外,它依賴於np.matrix實施細則,明確這是一個純粹的Python類,併爲所有類不起作用:

>>> numpy.ndarray.det = numpy.linalg.det 
------------------------------------------------------------ 
Traceback (most recent call last): 
    File "<ipython console>", line 1, in <module> 
TypeError: can't set attributes of built-in/extension type 'numpy.ndarray' 

我會反對這項建議;它會讓你的程序難以閱讀和維護,而且真的沒有理由不寫from numpy.linalg import det,然後det(A)而不是A.det()

+0

我認爲還有一點:'np.linalg.det'帶有一個參數,如果使它成爲'np.matrix'的一個方法,它就被用作「self」。如果有多個參數或根本沒有參數,我認爲它不會工作。 – bmu

+0

@bmu:它可以與多個參數一起工作,然後第一個是它被調用的實例,其餘的像往常一樣傳遞。將一個零參數函數作爲一個實例方法是沒有意義的,因爲它不會在任何東西上調用*。 –

+0

你是對的,但這就是我的意思:它或多或少是隨機的,它與這個函數一起工作,因爲它需要一個參數。只是想提一提,沒有問題與你的答案。 – bmu