numpy添加元素_科研速递 | 花费15年众望所归!NumPy论文终登上Nature!
NumPy 團隊撰寫了一篇綜述文章,介紹 NumPy 的發展過程、主要特性和數組編程等。這篇文章現已發表在 Nature 上。NumPy 是什么?它是大名鼎鼎的使用 Python 進行科學計算的基礎軟件包,是 Python 生態系統中數據分析、機器學習、科學計算的主力軍,極大簡化了向量與矩陣的操作處理。除了計算外,它還包括了功能強大的 N 維數組對象;精密廣播功能函數;集成 C/C++ 和 Fortran 代碼的工具;強大的線性代數、傅立葉變換和隨機數功能
接下來,我們來看這篇 NumPy 綜述論文的詳細內容(只摘取部分):(詳細版論文pdf拉至文末領取)
Abstract
數組編程為訪問,操縱和操作矢量,矩陣和高維數組中的數據提供了功能強大,緊湊且易于表達的語法。NumPy是Python語言的主要數組編程庫。它在物理,化學,天文學,地球科學,生物學,心理學,材料科學,工程,金融和經濟學等領域的研究分析流程中發揮著至關重要的作用。例如,在天文學中,NumPy是用于發現引力波1和首次對黑洞成像2的軟件堆棧的重要組成部分。
在這里,我們回顧一些基本的數組概念如何導致一種簡單而強大的編程范例,以組織,探索和分析科學數據。NumPy是構建科學Python生態系統的基礎。它是如此普遍,以至于針對具有特殊需求的受眾的幾個項目已經開發了自己的類似NumPy的界面和數組對象。由于其在生態系統中的中心地位,NumPy越來越多地充當此類陣列計算庫之間的互操作性層,并且與其應用程序編程接口(API)一起,提供了靈活的框架來支持未來十年的科學和工業分析。
Main
在NumPy之前存在兩個Python數組程序包。Numeric軟件包是在1990年代中期開發的,并使用Python提供了數組對象和數組感知功能。它被寫在C和連接到線性代數的標準快速實現。它的最早用途之一是在Lawrence Livermore國家實驗室進行C ++應用程序的慣性約束融合研究。為了處理來自哈勃太空望遠鏡的大型天文圖像,重新實現了稱為Numarray的數字,增加了對結構化數組的支持,靈活的索引,內存映射,字節順序變體,更有效的內存使用,靈活的IEEE 754標準錯誤處理功能和更好的類型轉換規則。盡管Numarray與Numeric高度兼容,但這兩個軟件包之間的差異足以使社區分裂。但是,在2005年,NumPy成為“兩全其美”的統一7-將 Numarray的功能與Numeric的小數組性能及其豐富的C API相結合。
如今,15年過去了,NumPy的支撐著幾乎每一個Python庫,做科學或數值計算,其中SciPy的,Matplotlib ,熊貓,scikit學習和scikit圖像。NumPy是社區開發的開放源代碼庫,它提供了多維Python數組對象以及對其進行操作的可感知數組的函數。由于其固有的簡單性,NumPy數組是Python中數組數據的事實上的交換格式。
NumPy使用中央處理器(CPU)在內存陣列上運行。為了利用現代的專用存儲和硬件,最近出現了Python數組軟件包的泛濫。與Numarray-Numeric鴻溝不同,這些新庫現在更難打亂用戶社區,因為NumPy之上已經建立了多少工作。但是,為了使社區能夠使用新的探索性技術,NumPy正在過渡到一種中央協調機制,該機制指定了定義良好的數組編程API,并在適當時將其分發給專門的數組實現。
NumPy arrays
NumPy數組是一種數據結構,可以有效地存儲和訪問多維數組17(也稱為張量),并可以進行多種科學計算。它由指向內存的指針以及用于解釋存儲在其中的數據的元數據組成,尤其是“數據類型”,“形狀”和“步幅”(圖1a)。
a,NumPy數組數據結構及其關聯的元數據字段。b,用切片和步驟索引數組。這些操作返回原始數據的“視圖”。c,用掩碼,標量坐標或其他數組索引數組,以便它返回原始數據的“副本”。在下面的示例中,一個數組與其他數組建立了索引。這將在執行查找之前廣播索引參數。d,向量化有效地將運算應用于元素組。e,以二維數組的乘法進行廣播。F,還原操作沿一個或多個軸進行。在此示例中,將沿選擇軸求和的數組相加以生成矢量,或者沿兩個軸連續求和以生成標量。g,示例NumPy代碼,說明了其中一些概念。
數據類型描述存儲在數組中的元素的性質。數組具有單一數據類型,并且數組的每個元素在內存中占用相同數量的字節。數據類型的示例包括實數和復數(較低和較高的精度),字符串,時間戳和指向Python對象的指針。
陣列的形狀確定沿每個軸的元素數,而軸數是陣列的維數。例如,數字向量可以存儲為形狀N的一維數組,而彩色視頻是形狀(T,? M,? N,3)的四維數組。
要將計算機線性存儲為多維數組的計算機內存解釋,必須大步向前。它們描述了要在內存中向前移動以在行與行之間,列與列之間跳轉的字節數,等等。例如,考慮一個形狀為(4,3)的二維浮點數數組,其中每個元素在內存中占用8個字節。要在連續的列之間移動,我們需要在內存中向前跳轉8個字節,然后訪問下一行3×8 = 24個字節。因此,該數組的步幅為(24,8)。NumPy可以按C或Fortran內存順序存儲數組,首先在行或列上進行迭代。這允許使用這些語言編寫的外部庫直接訪問內存中的NumPy數組數據。
用戶使用“索引”(訪問子數組或單個元素),“運算符”(例如,用于矢量化運算的+,-和×和用于矩陣乘法的@)與NumPy數組進行交互;以及“可感知數組的函數”;它們共同為數組編程提供了一個易于閱讀,易于表達的高級API,而NumPy則處理了提高操作速度的基本機制。
對數組建立索引將返回滿足特定條件的單個元素,子數組或元素(圖1b)。甚至可以使用其他數組對數組進行索引(圖1c)。在可能的情況下,檢索子數組的索引將在原始數組上返回一個“視圖”,以便在兩個數組之間共享數據。這提供了一種強大的方法來處理陣列數據的子集,同時限制了內存的使用。
為了補充數組語法,NumPy包括對數組執行矢量化計算的函數,包括算術,統計和三角函數(圖1d)。向量化(對整個陣列而非單個元素進行操作)對于陣列編程至關重要。這意味著用數十種行來表示的語言(例如C語言)的操作通常可以實現為單個清晰的Python表達式。這樣可以生成簡潔的代碼,使用戶可以將精力集中在分析的細節上,而NumPy則以近乎最佳的方式處理數組元素上的循環-例如,考慮到最大程度地利用計算機的快速緩存。
在具有相同形狀的兩個數組上執行向量化操作(例如加法)時,很清楚會發生什么。通過“廣播”,NumPy允許尺寸不同,并產生吸引直覺的結果。一個簡單的示例是將標量值添加到數組,但是廣播也可以推廣到更復雜的示例,例如縮放數組的每一列或生成坐標網格。在廣播中,一個或兩個陣列實際上是重復的(即,不復制任何數據在內存中),因此操作數的形狀匹配(圖1d)。當使用索引數組對數組進行索引時,也會應用廣播(圖1c)。
其他陣列感知功能(例如求和,均值和最大值)執行逐個元素的“歸約”,在單個陣列的一個,多個或所有軸上匯總結果。例如,求和的?維陣列上方d的尺寸的陣列軸線結果???-? d(圖1F)。
NumPy還包含用于創建,重塑,連接和填充數組的數組感知功能;搜索,分類和計數數據;以及讀寫文件。它提供了用于產生偽隨機數的廣泛支持,包括概率分布的分類,并進行加速線性代數,使用幾個后端諸如OpenBLAS之一在手為CPU的優化或Intel MKL(更多細節請參見補充方法) 。
總而言之,簡單的內存中數組表示形式,緊密模擬數學的語法以及各種可識別數組的實用程序功能的組合形成了一種高效且功能強大的數組編程語言。
Scientific Python ecosystem
Python是一種開放源代碼的通用解釋型編程語言,非常適合諸如清潔數據,與Web資源交互和解析文本之類的標準編程任務。增加快速的數組運算和線性代數,使科學家能夠在一種編程語言中完成所有工作,這是一種眾所周知的易學易教的優勢,這已被許多大學用作主要學習語言而見證。
即使NumPy不是Python標準庫的一部分,它也可以從與Python開發人員的良好關系中受益。多年來,Python語言增加了新功能和特殊語法,因此NumPy將具有更簡潔和易于閱讀的數組表示法。但是,由于它不是標準庫的一部分,因此NumPy能夠規定其自己的發布策略和開發模式。
在歷史,開發和使用方面,SciPy和Matplotlib與NumPy緊密結合。SciPy提供了用于科學計算的基本算法,包括數學,科學和工程例程。Matplotlib生成可發布的圖形和可視化文件。NumPy,SciPy和Matplotlib的結合,以及高級交互環境(例如IPython 20或Jupyter 21),為Python中的數組編程奠定了堅實的基礎。科學的Python生態系統(圖2)建立在此基礎之上,以提供幾個,廣泛用于特定技術庫,這反過來背后眾多特定于域的項目。NumPy是陣列感知庫生態系統的基礎,它設置了文檔標準,提供了陣列測試基礎結構,并增加了對Fortran和其他編譯器的構建支持。
依賴NumPy API的基本庫和項目可以訪問支持NumPy陣列協議的新陣列實現(圖3)。
許多研究小組設計了大型,復雜的科學庫,這些庫為生態系統添加了特定于應用程序的功能。例如,eht影像庫29由Event Horizon Telescope合作開發的,用于無線電干涉測量成像,分析和仿真,它依賴于科學Python生態系統的許多底層組件。特別是,EHT合作使用該庫對黑洞進行了首次成像。在eht成像中,NumPy數組用于在處理鏈的每個步驟中存儲和處理數字數據:從原始數據到校準和圖像重建。SciPy提供用于一般圖像處理任務(例如過濾和圖像對齊)的工具,而scikit-image是擴展SciPy的圖像處理庫,提供了更高級別的功能,例如邊緣濾鏡和霍夫變換。“ scipy.optimize”模塊執行數學優化。NetworkX 22,用于復雜網絡分析的軟件包,用于驗證圖像比較的一致性。Astropy 23,24個手柄標準天文文件格式,并計算時間的坐標變換。Matplotlib用于可視化數據并生成黑洞的最終圖像。
由數組編程基礎和周圍的工具生態系統(在IPython或Jupyter內部)創建的交互式環境非常適合于探索性數據分析。用戶可以流暢地檢查,操縱和可視化他們的數據,并快速迭代以完善編程語句。然后將這些語句組合成命令式或功能性程序,或包含計算和敘述的筆記本。超出探索性工作的科學計算通常在文本編輯器或諸如Spyder的集成開發環境(IDE)中完成。這種豐富而高效的環境使Python在科學研究中頗受歡迎。
為了完善該工具以進行探索性工作和快速制作原型,NumPy建立了一種使用經過時間考驗的軟件工程實踐來改善協作并減少錯誤的文化30。這種文化不僅被項目領導者采用,而且還熱情地向新來者傳授。NumPy團隊很早就采用分布式修訂控制和代碼審查來改善代碼協作,并為NumPy的每個擬議變更進行連續測試,從而運行大量自動測試。該項目還具有全面的,高質量的文件,與源代碼集成31,32,33。
在NumPy上建立的圖書館生態系統已采用這種使用最佳實踐來生產可靠的科學軟件的文化。例如,在皇家天文學會最近頒發給Astropy的獎項中,他們指出:“ Astropy項目為數百名初級科學家提供了專業標準軟件開發實踐的經驗,包括版本控制的使用,單元測試,代碼審查和問題跟蹤程序。對于現代研究人員而言,這是一項至關重要的技能,而物理學或天文學的正規大學教育通常卻不具備這種技能。”? 社區成員明確合作,通過課程來解決這個缺乏正規教育和研討會。
最近數據科學,機器學習和人工智能的快速發展進一步并極大地促進了Python的科學使用。它的重要應用示例,例如eht圖像庫,現在幾乎在自然科學和社會科學的每個學科中都有。這些工具已成為許多領域的主要軟件環境。NumPy及其生態系統通常在大學課程,新兵訓練營和暑期學校中教授,并且是全球社區會議和研討會的重點。NumPy及其API已真正普及。
領取方式
由于篇幅較長,無法完全展示
論文詳細版pdf
后臺回復“N”即可領取
監制:石換如
編輯:高婷
校對:劉書含
版權申明:本文內容來源于nature官網,由小編做整理,文章轉載只為學術傳播,如涉及侵權問題,請聯系我們,我們將及時修改或刪除。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的numpy添加元素_科研速递 | 花费15年众望所归!NumPy论文终登上Nature!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jdbc版本怎么看_Jmeter(十三)
- 下一篇: java comparator_Java