在MAC OS X上裝置MYSQL。本站提示廣大學習愛好者:(在MAC OS X上裝置MYSQL)文章只能為提供參考,不一定能成為您想要的結果。以下是在MAC OS X上裝置MYSQL正文
要懂得 Numerical Python 軟件包的第一件工作是,Numerical Python 不會讓您去做尺度 Python 不克不及完成的任何任務。它只是讓您 以快很多的速度去完成尺度 Python 可以或許完成的雷同義務。現實上不只僅如斯;很多數組操感化 Numeric 或許 Numarray 來表達比升引尺度 Python 數據類型和語法來表達要優雅很多。不外,驚人的速度才是吸援用戶應用 Numerical Python 的重要緣由。
其實,Numerical Python 只是完成了一個新的數據類型:數組。與可以包括分歧類型元素的列表、元組和辭書分歧的是,Numarray 數組只能包括統一類型的數據。Numarray 數組的另外一個長處是,它可所以多維的 -- 然則數組的維度與列表的簡略嵌套稍有分歧。Numerical Python 自創了法式員的理論經歷(特別是那些有迷信盤算配景的法式員,他們籠統出了 APL、FORTRAN、MATLAB 和 S 等說話中數組的最好功效),創立了可以靈巧轉變外形和維度的數組。我們很快會回來持續這一話題。
在 Numerical Python 中對數組的操作是 按元素停止的。固然二維數組與線性代數中的矩陣相似,然則對它們的操作 (好比乘) 與線性代數中的操作 (好比矩陣乘) 是完整分歧的。
讓我們來看一個關於上述成績的的詳細例子。在純 Python 中,您可以如許創立一個“二維列表”:
清單 1. Python 的嵌套數組
>>> pyarr = [[1,2,3], ... [4,5,6], ... [7,8,9]] >>> print pyarr [[1, 2, 3], [4, 5, 6], [7, 8, 9]] >>> pyarr[1][1] = 0 >>> print pyarr [[1, 2, 3], [4, 0, 6], [7, 8, 9]]
很好,然則您對這類構造所能做的只是經由過程零丁的 (或許多維的) 索引來設置和檢索元素。與此比擬,Numarray 數組要更靈巧:
清單 2. Numerical Python 數組
>>> from numarray import * >>> numarr = array(pyarr) >>> print numarr [[1 2 3] [4 0 6] [7 8 9]]
轉變其實不年夜,然則應用 Numarray 停止的操作若何呢? 上面是一個例子:
清單 3. 元素操作
>>> numarr2 = numarr * 2 >>> print numarr2 [[ 2 4 6] [ 8 0 12] [14 16 18]] >>> print numarr2 + numarr [[ 3 6 9] [12 0 18] [21 24 27]]
轉變數組的外形:
清單 4. 轉變外形
>>> numarr2.shape = (9,) >>> print numarr2 [ 2 4 6 8 0 12 14 16 18]
Numeric 與 Numarray 之間的差別
整體來看,新的 Numarray 軟件包與晚期的 Numeric 是 API 兼容的。不外,開辟者基於用戶經歷停止了一些與 Numric 其實不兼容的改良。開辟者沒有損壞任何依附於 Numeric 的運用法式,而是首創了一個叫做 Numarray 的新項目。在完本錢文時,Numarray 還缺乏 Numeric 的一些功效,然則已籌劃完成這些功效。
Numarray 所做的一些改良:
新用戶不用擔憂這些變更,就這一點來講,最好一開端就應用 Numarray 而不是 Numeric。
計時的例子
讓我們來感觸感染一下在 Numerical Python 中的操作絕對於尺度 Python 的速度優勢。作為一個“演示義務”,我們將創立一個數字序列,然後使它們加倍。起首是尺度 Python 辦法的一些變體:
清單 5. 對純 Python 操作的計時
def timer(fun, n, comment=""): from time import clock start = clock() print comment, len(fun(n)), "elements", print "in %.2f seconds" % (clock()-start) def double1(n): return map(lambda n: 2*n, xrange(n)) timer(double1, 5000000, "Running map() on xrange iterator:") def double2(n): return [2*n for n in xrange(n)] timer(double2, 5000000, "Running listcomp on xrange iter: ") def double3(n): double = [] for n in xrange(n): double.append(2*n) return double timer(double3, 5000000, "Building new list from iterator: ")
我們可以看出 map() 辦法、list comprehension 和傳統輪回辦法之間的速度差異。那末,須要同類元素類型的尺度 array 模塊呢?它能夠會更快一些:
清單 6. 對尺度 array 模塊的計時
import array def double4(n): return [2*n for n in array.array('i',range(n))] timer(double4, 5000000, "Running listcomp on array.array: ")
最初我們來看 Numarray 的速度若何。作為額定對比,我們來看假如必需要將數組復原為一個尺度的列表時,它能否異樣具有優勢:
清單 7. 對 Numarray 操作的計時
from numarray import * def double5(n): return 2*arange(n) timer(double5, 5000000, "Numarray scalar multiplication: ") def double6(n): return (2*arange(n)).tolist() timer(double6, 5000000, "Numarray mult, returning list: ")
如今運轉它:
清單 8. 比擬成果
$ python2.3 timing.py Running map() on xrange iterator: 5000000 elements in 13.61 seconds Running listcomp on xrange iter: 5000000 elements in 16.46 seconds Building new list from iterator: 5000000 elements in 20.13 seconds Running listcomp on array.array: 5000000 elements in 25.58 seconds Numarray scalar multiplication: 5000000 elements in 0.61 seconds Numarray mult, returning list: 5000000 elements in 3.70 seconds
處置列表的分歧技巧之間的速度差別不年夜,或許照樣值得留意,由於這是測驗考試尺度的 array 模塊時的辦法成績。然則 Numarray 普通用不到 1/20 的時光內便可以完成操作。將數組復原為尺度列表喪失了很年夜的速度優勢。
不該經由過程如許一個簡略的比擬就得出結論,然則這類加快能夠是典范的。對年夜范圍迷信盤算來講,將盤算的時光由幾個月降低到幾天或許從幾世界降到幾個小時,長短常有價值的。
體系建模
Numerical Python 的典范用例是迷信建模,或許能夠是相干范疇,好比圖形處置和扭轉,或許旌旗燈號處置。我將經由過程一個比擬現實的成績來講明 Numarray 的很多功效。假定您有一個參量可變的三維物理空間。籠統地說,任何參數化空間,豈論有若干維,Numarray 都實用。現實上很輕易想像,好比一個房間,它的各個點的溫度是分歧的。我在 New England 的家曾經到了冬季,因此這個成績仿佛更有實際意義。
為簡略起見,上面我給出的例子中應用的是較小的數組(固然這能夠是明顯的,然則照樣有需要明白地指出來)。不外,即便是處置有上百萬個元素而不只僅是幾十個元素的數組,Numarray 也照樣很快;前者能夠在真實的迷信模子中更加罕見。
起首,我們來創立一個“房間”。有許多辦法可以完成這項義務,然則最經常使用的照樣應用可挪用的 array() 辦法。應用這個辦法,我們可以生成具有多種初始化參數 (包含來自任何 Python 序列的初始數據) 的 Numerical 數組。不外關於我們的房間來講,用 zeros() 函數便可以生成一個溫度平均的嚴寒房間:
清單 9. 初始化房間的溫度
>>> from numarray import * >>> room = zeros((4,3,5),Float) >>> print room [[[ 0. 0. 0. 0. 0.] [ 0. 0. 0. 0. 0.] [ 0. 0. 0. 0. 0.]] [[ 0. 0. 0. 0. 0.] [ 0. 0. 0. 0. 0.] [ 0. 0. 0. 0. 0.]] [[ 0. 0. 0. 0. 0.] [ 0. 0. 0. 0. 0.] [ 0. 0. 0. 0. 0.]] [[ 0. 0. 0. 0. 0.] [ 0. 0. 0. 0. 0.] [ 0. 0. 0. 0. 0.]]]
自上而下每個二維的“矩陣”代表三維房間的一個程度層面。
起首,我們將全部房間的溫度進步到比擬溫馨的 70 華氏度 (年夜約是 20 攝氏度):
清單 10. 翻開加熱器
>>> room += 70 >>> print room [[[ 70. 70. 70. 70. 70.] [ 70. 70. 70. 70. 70.] [ 70. 70. 70. 70. 70.]] [[ 70. 70. 70. 70. 70.] [ 70. 70. 70. 70. 70.] [ 70. 70. 70. 70. 70.]] [[ 70. 70. 70. 70. 70.] [ 70. 70. 70. 70. 70.] [ 70. 70. 70. 70. 70.]] [[ 70. 70. 70. 70. 70.] [ 70. 70. 70. 70. 70.] [ 70. 70. 70. 70. 70.]]]
請留意,在我們接上去對 Numarray 數組和 Python 列表停止操作時有很主要的差別。當您拔取數組的層面時 -- 我們將會看到,多維數組中的分層辦法異常靈巧且壯大 -- 您獲得的不是一個拷貝而是一個“視圖”。指向雷同的數據可以有多種門路。
讓我們詳細來看。假定我們房間有一個透風裝配,會將空中的溫度下降四度:
清單 11. 溫度的變更
>>> floor = room[3] >>> floor -= 4 >>> print room [[[ 70. 70. 70. 70. 70.] [ 70. 70. 70. 70. 70.] [ 70. 70. 70. 70. 70.]] [[ 70. 70. 70. 70. 70.] [ 70. 70. 70. 70. 70.] [ 70. 70. 70. 70. 70.]] [[ 70. 70. 70. 70. 70.] [ 70. 70. 70. 70. 70.] [ 70. 70. 70. 70. 70.]] [[ 66. 66. 66. 66. 66.] [ 66. 66. 66. 66. 66.] [ 66. 66. 66. 66. 66.]]]
與此絕對,北面牆上的壁爐將每一個臨近地位的溫度降低了 8 度,而它地點地位的溫度為 90 度。
清單 12. 應用壁爐取暖
>>> north = room[:,0] >>> near_fireplace = north[2:4,2:5] >>> near_fireplace += 8 >>> north[3,2] = 90 # the fireplace cell itself >>> print room [[[ 70. 70. 70. 70. 70.] [ 70. 70. 70. 70. 70.] [ 70. 70. 70. 70. 70.]] [[ 70. 70. 70. 70. 70.] [ 70. 70. 70. 70. 70.] [ 70. 70. 70. 70. 70.]] [[ 70. 78. 78. 78. 70.] [ 70. 70. 70. 70. 70.] [ 70. 70. 70. 70. 70.]] [[ 66. 74. 90. 74. 66.] [ 66. 66. 66. 66. 66.] [ 66. 66. 66. 66. 66.]]]
這裡我們應用了一些比擬奇妙的索引辦法,可以沿多維的偏向來指定層面。這些視圖應當保存,今後還會用到。例如,您能夠願望曉得全部北面牆上確當前溫度:
清單 13. 檢查北面的牆
>>> print north [[ 70. 70. 70. 70. 70.] [ 70. 70. 70. 70. 70.] [ 70. 78. 78. 78. 70.] [ 66. 74. 90. 74. 66.]]
更多操作
以上引見的僅僅是 Numarray 中便捷的函數和數組辦法/屬性中的一小部門。我願望能給您一些初步的熟悉;Numarray 文檔是深刻進修的極好參考材料。
既然我們的房間如今遍地的溫度不再雷同,我們能夠須要斷定全局的狀況。例如,以後房間內的均勻溫度:
清單 14. 檢查均勻化後的數組
>>> add.reduce(room.flat)/len(room.flat) 70.066666666666663
這裡須要說明一下。您可以對數組停止的一切操作都有絕對應的 通用函數 (ufunc)。所以,我們在後面的代碼中應用的 floor -= 4 ,可以調換為 subtract(floor,4,floor) 。指定 subtract() 的三個參數,操作便可以准確完成。您還可以用 floor=subtract(floor,4) 來創立 floor 的一個拷貝,但這能夠不是您所希冀的,由於變更將產生在一個新的數組中,而不是 room 的一個子集中。
但是,unfunc 不只僅是函數。它們還可所以可挪用的對象,具有本身的辦法:個中 .reduce() 能夠是最為有效的一個。 reduce() 的任務方法好像 Python 中的內置函數 reduce() ,每一個操作都是根本的 ufunc (不外這些辦法在運用於 Numerical 數組時會快很多)。換句話說, add.reduce() 表現的是 sum() , multiply.reduce() 表現的是 product() (這些快捷稱號也是界說好了的)。
在求房間各單位溫度的和之前,您須要先獲得數據的一個一維視圖。否則,您獲得的是第一維的和,並生成一個下降了維數的新數組。例如:
清單 15. 非立體數組的毛病成果
>>> add.reduce(room) array([[ 276., 292., 308., 292., 276.], [ 276., 276., 276., 276., 276.], [ 276., 276., 276., 276., 276.]])
如許一個空間和能夠會有效,但它其實不是我們這裡想要獲得的。
既然我們是在對一個物理體系建模,我們來讓它更真實一些。房間內有渺小的氣流,使得溫度產生變更。在建模時我們可以假定每個小的時光段內,每一個單位會依據它四周的溫度停止調劑:
清單 16. 微氣流模仿
>>> def equalize(room): ... z,y,x = map(randint, (1,1,1), room.shape) ... zmin,ymin,xmin = maximum([z-2,y-2,x-2],[0,0,0]).tolist() ... zmax,ymax,xmax = [z+1,y+1,x+1] ... region = room[zmin:zmax,ymin:ymax,xmin:xmax].copy() ... room[z-1,y-1,x-1] = sum(region.flat)/len(region.flat) ... return room
這個模子固然有一些不實際:單位不會只依據它四周的溫度停止調劑而不去影響它相鄰的單位。雖然如斯,照樣讓我們來看一下它履行的情形。起首我們選擇一個隨機的單位 -- 或許現實上我們拔取的是單位自己在每維度上的索引值加上 1,由於我們經由過程 .shape 挪用獲得的是長度而不是最年夜的索引值。 zmin 、 ymin 和 xmin 確保了我們的最小值索引值為 0,不會取到正數; zmax 、 ymax 和 xmax 現實上其實不須要,由於數組每維的年夜小減去 1 以後的索引值就被看成最年夜值來應用(好像 Python 中的列表)。
然後,我們須要界說臨近單位的區域。因為我們的房間很小,所以常常會選擇到房間的外面、邊緣或許一角 -- 單位的 region 能夠會比最年夜的 27 元素 (3x3x3) 子集要小。這沒緊要;我們只須要應用准確的分母來盤算均勻值。這個新的均勻溫度值被賦給後面隨機選擇的單位。
您可以在您的模子中履行隨意率性屢次的均勻化進程。每次挪用只調劑一個單位。屢次挪用會應用房間的某些部門的溫度逐步趨於均勻。即便數組是靜態轉變的, equalize() 函數照樣可以前往它的數組。當您只想均勻化模子的一個 拷貝時這將異常有效:
清單 17. 履行 equalize()
>>> print equalize(room.copy()) [[[ 70. 70. 70. 70. 70. ] [ 70. 70. 70. 70. 70. ] [ 70. 70. 70. 70. 70. ]] [[ 70. 70. 71.333333 70. 70. ] [ 70. 70. 70. 70. 70. ] [ 70. 70. 70. 70. 70. ]] [[ 70. 78. 78. 78. 70. ] [ 70. 70. 70. 70. 70. ] [ 70. 70. 70. 70. 70. ]] [[ 66. 74. 90. 74. 66. ] [ 66. 66. 66. 66. 66. ] [ 66. 66. 66. 68. 66. ]]]
停止語
本文僅引見了 Numarray 的部門功效。它的功效遠不止這些。例如,您可使用填充函數來填湊數組,這關於物理模子來講異常有效。您不只可以經由過程層面並且可以經由過程索引數組來指定命組的子集 -- 這使您不只可以對數組中不持續的片段停止操作,並且可以 -- 經由過程 take() 函數 -- 以各類方法從新界說數組的維數和外形。
後面我所描寫的年夜部門操作都是針關於標量和數組的;您還可以履行數組之間的操作,包含那些分歧維度的數組之間。這觸及到的內容許多,但經由過程 API 可以直不雅地完成一切這些操作。
我勉勵您在本身的體系上裝置 Numarray 和 / 或 Numeric。它不難上手,而且它供給的對數組的疾速操作可以運用於極普遍的范疇 -- 常常是您開端時意想不到的。