2013-10-23 63 views
3

我一直在使用科學python(通過from pylab import *)一段時間作爲一個免費的Matlab替代品,主要用於化學工程(我是IPython的粉絲筆記本)。對我而言,總覺得奇怪的事實是,通常有兩種不同的方式與對象進行交互。舉例來說,如果我有一個數組,我可以告訴在兩個方面的維度:「正確」的方式與numpy對象進行交互

a = array([1,2,3],[2,3,4])

有該公司的Matlab「的方式:

shape(a)

或者代替我能找到它打字:

a.shape

這似乎違背PYT的禪洪:「應該有一個 - 最好只有一個 - 明顯的方法來做到這一點」

我只是想知道爲什麼有多種方式做同樣的事情,哪種做法更基礎/自然的語言,從長遠來看最好使用。

回答

4

使用該方法是優選的。畢竟,shape實施只是推遲的方法呢(從/numpy/core/fromnumeric.py):

def shape(a): 
    try: 
     result = a.shape 
    except AttributeError: 
     result = asarray(a).shape 
    return result 

我承擔了很多這方面的東西pylab只是包括幫助緩解人們從MATLAB來過渡。習慣它,因爲許多更多numpy的例子,ahem,不是很pythonic。

當你更習慣於python和matplotlib時,你可能會想拋棄from pylab import *,並開始編寫更多的numpythonic代碼,而不是MATLAB風格的工作。

3

它主要歸結爲一個偏好問題,但是您可能想要了解一些差異。首先,你應該使用numpy.shape(a)np.shape(a)而不是shape(a),這是因爲「命名空間是一個好點子 - 讓我們做更多的!」但實際上,numpy有幾個名字,你可能會在其他python模塊中找到,例如array在Python stdlib,numpy.arraynumpy.ma.array中出現array.array,所以爲了避免混淆其他(和你自己),只需繼續並避免導入整個numpy命名空間。

除此之外,事實證明numpy.shape,和大多數其他類似的功能,只是在參數上尋找形狀屬性/方法,如果他們沒有找到一個,他們嘗試並將參數轉換爲數組。下面是代碼:

def shape(a): 
    try: 
     result = a.shape 
    except AttributeError: 
     result = asarray(a).shape 
    return result 

如果你想要一個「array_like」對象的形狀。這可能是有用的,你會發現大多數numpy的功能,採取「array_like」的論點。但是,如果您正在做類似的事情,速度可能會很慢:

shape = np.shape(list_of_lists) 
mx = np.max(list_of_lists) 
mn = np.min(list_of_lists) 

除此之外,它們幾乎相同。

相關問題