15年!NumPy論文終出爐,還登上了Nature

2021-01-11 澎湃新聞

機器之心報導

編輯:魔王、杜偉、小舟

NumPy 團隊撰寫了一篇綜述文章,介紹 NumPy 的發展過程、主要特性和數組編程等。這篇文章現已發表在 Nature 上。

NumPy 是什麼?它是大名鼎鼎的使用 Python 進行科學計算的基礎軟體包,是 Python 生態系統中數據分析、機器學習、科學計算的主力軍,極大簡化了向量與矩陣的操作處理。除了計算外,它還包括了:

功能強大的 N 維數組對象。

精密廣播功能函數。

集成 C/C++ 和 Fortran 代碼的工具。

強大的線性代數、傅立葉變換和隨機數功能

今日,NumPy 核心開發團隊的論文終於在 Nature 上發表,詳細介紹了使用 NumPy 的數組編程(Array programming)。這篇綜述論文的發表距離 NumPy 誕生已經過去了 15 年。

論文地址:https://www.nature.com/articles/s41586-020-2649-2

NumPy 官方團隊在 Twitter 上簡要概括了這篇論文的核心內容:

NumPy 為數組編程提供了簡明易懂、表達力強的高級 API,同時還考慮了維持快速運算的底層機制。

NumPy 提供的數組編程基礎和生態系統中的大量工具結合,形成了適合探索性數據分析的完美交互環境。NumPy 還包括增強與 PyTorch、Dask 和 JAX 等外部庫互操作性的協議。

基於這些特性,NumPy 為張量計算提供了標準的 API,成為 Python 中不同數組技術之間的核心協調機制。

接下來,我們來看這篇 NumPy 綜述論文的詳細內容。

論文摘要

數組編程為訪問、操縱和計算向量、矩陣和高維數組中的數據提供了功能強大、緊湊且表達力強的語法。NumPy 是 Python 語言的主要數組編程庫,它在物理、化學、天文學、地球科學、生物學、心理學、材料科學、工程學、金融和經濟學等領域的研究分析中都起著至關重要的作用。例如,在天文學中,NumPy 是發現引力波和黑洞首次成像的軟體棧中的重要部分。

這篇論文回顧了一些基本的數組概念,以及它們如何形成一種簡單而強大的編程範式,使其能夠用於組織、探索和分析科學數據。NumPy 是構建科學 Python 生態系統的基礎。它的應用十分普遍,一些面向特殊需求受眾的項目已經開發出自己的類 NumPy 接口和數組對象。

由於其在 Python 生態系統中的核心地位,NumPy 越來越多地充當數組計算庫之間的互操作層,並且和其 API 一起提供了靈活的框架,以支持未來十年的科學和工業分析。

NumPy 的演變史

在 NumPy 之前,已經出現了兩個 Python 數組包。Numeric 包開發於 20 世紀 90 年代中期,它提供了 Python 中的數組對象和 array-aware 函數。Numeric 是用 C 語言寫的,並連結到線性代數的標準快速實現。其最早的應用之一是美國勞倫斯利弗莫爾國家實驗室的慣性約束核聚變研究。

為了處理來自哈勃太空望遠鏡的大型天文圖像,Numeric 被重實現為 Numarray,它添加了對結構化數組、靈活 indexing、內存映射、字節序變體、更高效的內存使用以及更好的類型轉換規則的支持。

儘管 Numarray 與 Numeric 高度兼容,但這兩個包之間的差異足以將社區開發者分為兩類。而 2005 年,NumPy 的出現完美地統一了這兩個包,它將 Numarray 的功能和 Numeric 的 small-array 性能及其豐富的 C API 結合起來。

如今,15 年過去了,NumPy 幾乎支持所有進行科學和數值計算的 Python 庫(包括 SciPy、Matplotlib、pandas、scikit-learn 和 scikit-image)。NumPy 是一個社區開發的開源庫,它提供了多維 Python 數組對象以及對其進行操作的 array-aware 函數。由於其固有的簡潔性,事實上 NumPy 數組已經成為 Python 中數組數據的交換格式。

NumPy 使用 CPU 對內存內(in-memory)數組進行操作。為了利用現代的專用存儲和硬體,最近已經擴展出一系列 Python 數組包。與 Numarray–Numeric 之間存在較大差異的情況不同,現在的這些新庫很難在社區開發者中引起分歧,因為它們都是建立在 NumPy 之上的。但是,為了使社區能夠使用新的探索性技術,NumPy 正在過渡為核心協調機制,該機制規劃了良好定義的數組編程 API,並在合適的時候將其分發給專門的數組實現。

NumPy 數組

NumPy 數組是一種能夠高效存儲和訪問多維數組的數據結構,支持廣泛類型的科學計算。NumPy 數組包括指針和用於解釋存儲數據的元數據,即 data type(數據類型)、shape(形狀)和 strides(步幅),參見下圖 1a。

圖 1:NumPy 數組包括多種基礎數組概念。

數據類型描述了數組中存儲元素的本質。一個數組只有一個數據類型,數組中的每個元素在內存中佔用的字節數是一樣的。數據類型包括實數、複數、字符串、timestamp 和指針等。

數組的形狀決定了每個軸上的元素數量,軸的數量即為數組的維數。例如,數字向量可存儲為形狀為 N 的一維數組,而彩色視頻是形狀為 (T, M, N, 3) 的四維數組。

步幅是解釋計算機內存的必要組件,它可以線性地存儲元素。步幅描述了在內存中逐行逐列移動時所需的字節數。例如,形狀為 (4, 3) 的二維浮點數數組,它其中的每個元素均在內存中佔用 8 個字節數。要想在連續列之間移動,我們需要在內存中前進 8 個字節數,要想到達下一行,則需要前進 3 × 8 = 24 個字節數。因此該數組的步幅為 (24, 8)。NumPy 可以用 C 或 Fortran 的內存順序存儲數組,沿著行或列遍歷。這使得使用這些語言寫的外部庫可以直接訪問內存中的 NumPy 數組數據。

用戶使用「indexing」(訪問子數組或單個元素)、「operators」(各種運算符)和「array-aware function」與 NumPy 數組進行交互。它們為 NumPy 數組編程提供了簡明易懂、表達力強的高級 API,同時還考慮了維持快速運算的底層機制。

對數組執行 indexing 將返回單個元素、子數組或滿足特定條件的元素(參見上圖 1b)。數組甚至還可以用其他數組進行 indexing(參加圖 1c)。返回子數組的 indexing 還可以返回原始數組的「view」,以便在兩個數組之間共享數據。這就為內存有限的情況下基於數組數據子集進行運算提供了一種強大的方式。

為了補充數組語法,NumPy 還包括對數組執行向量化計算的函數,包括 arithmetic、statistics 和 trigonometry(參見圖 1d)。向量化計算基於整個數組運行而不是其中的單個元素,這對於數組編程而言是必要的。這意味著,在 C 等語言中需要幾十行才能表達的運算在這裡只需一個清晰的 Python 表達式即可實現。這就帶來了簡潔的代碼,並使得用戶不必關注分析細節,同時 NumPy 以接近最優的方式循環遍歷數組元素。

對兩個形狀相同的數組執行向量化計算(如加法)時,接下來會發生什麼是很明確的。而「broadcasting」機制允許 NumPy 處理維度不同的數組之間的運算,例如向數組添加一個標量值。broadcasting 還能泛化至更複雜的示例,如縮放數組的每一列或生成坐標網格。在 broadcasting 中,單個或兩個數組可以重疊(沒有從內存中複製任何數據),使得 operands 的形狀匹配(參見圖 1d)。

其他 array-aware function(如加、求平均值、求最大值)都是執行逐元素的「reduction」,累積單個數組的一個、多個或所有軸上的結果。例如,將一個 n 維數組與 d 個軸進行累加,得到維度為 n − d 的數組(參見圖 1f)。

NumPy 還包含可以創建、reshaping、concatenating 和 padding 數組,執行數據排序和計數,讀取和寫入文件的 array-aware function。這為生成偽隨機數提供了大量支持,它還可以使用 OpenBLAS 或 Intel MKL 等後端執行加速線性代數。

總之,內存內的數組表示、緊密貼近數學的語法和多種 array-aware function 共同構成了生產力強、表達力強的數組程式語言。

科學 Python 生態系統

Python 是一個開源、通用的解釋型程式語言,非常適合數據清洗、與 web 資源交互和解析文本之類的標準編程任務。添加快速數組操作和線性代數能夠讓科學家在一種程式語言中完成所有的工作。

儘管 NumPy 不是 Python 標準庫的一部分,但它也從與 Python 開發者的良好關係中受益。在過去這些年中,Python 語言已經加入了一些新的功能和特殊的語法,以便 NumPy 具備更加簡潔和易於閱讀的數組表示法。但是,由於 NumPy 不是 Python 標準庫的一部分,所以它能夠規定自己的發布策略和開發模式。

從發展史、開發和應用的角度來看,SciPy 和 Matplotlib 與 NumPy 聯繫緊密。SciPy 為科學計算提供了基礎算法,包括數學、科學和工程程序。Matplotlib 生成可發表品質的圖表和可視化文件。NumPy、SciPy 和 Matplotlib 的結合,再加上 IPython、Jupyter 這類高級交互環境,為 Python 中的數組編程提供了堅實的基礎。

如圖 2 所示,科學 Python 生態系統建立在上述基礎之上,它提供了多種廣泛應用的專有技術庫,而這又是眾多領域特定項目的基礎。NumPy 是這一 array-aware 庫生態系統的基礎,它設置了文檔標準、提供了數組測試基礎結構,並增加了對 Fortran 等編譯器的構建支持。

圖 2:NumPy 是科學 Python 生態系統的基礎。

很多研究團隊設計出大型、複雜的科學庫,這些庫為 Python 生態系統增添了特定於具體應用的功能。例如,由事件視界望遠鏡(Event Horizon Telescope, EHT)合作項目開發的 eht-imaging 庫依賴科學 Python 生態系統的很多低級組件。而 EHT 合作項目利用該庫捕獲了黑洞的首張圖像。

在 eht-imaging 庫中,NumPy 數組在流程鏈的每一步存儲和操縱數值數據。

基於數組編程創建的交互式環境及其周邊的工具生態系統(IPython 或 Jupyter 內部)完美適用於探索性數據分析。用戶可以流暢地檢查、操縱和可視化他們的數據,並快速迭代以改善編程語句。然後,將這些語句拼接入命令式或函數式程序,或包含計算和敘述的 notebook。

超出探索性研究的科學計算通常在文本編輯器或 Spyder 等集成開發環境(IDE)中完成。這一豐富和高產的環境使 Python 在科學研究界流行開來。

為了給探索性研究和快速原型提供補充支持,NumPy 形成了使用經過時間檢驗的軟體工程實踐來提升協作、減少誤差的文化。這種文化不僅獲得了項目領導者的採納,而且還被傳授給初學者。NumPy 團隊很早就採用分布式版本控制和代碼審查機制來改善代碼協同,並使用持續測試對 NumPy 的每個提議更改運行大量自動化測試。

這種使用最佳實踐來製作可信賴科學軟體的文化已經被基於 NumPy 構建的生態系統所採用。例如,在近期英國皇家天文學會授予 Astropy 的一項獎項中表示:「Astropy 項目為數百名初級科學家提供了專業水平的軟體開發實踐,包括版本控制使用、單元測試、代碼審查和問題追蹤程序等。這對於現代研究人員而言是一項重要的技能組合,但物理或天文學專業的正規大學教育卻常常忽略這一點。」社區成員通過課程和研討會來彌補正規教育中的這一缺失。

近來數據科學、機器學習和人工智慧的快速發展進一步大幅提升了 Python 的科學使用。Python 的重要應用,如 eht-imaging 庫,現已存在於自然和社會科學的幾乎每個學科之中。這些工具已經成為很多領域主要的軟體環境。大學課程、新手培訓營和暑期班通常教授 NumPy 及其生態系統,它們也成為世界各地社區會議和研討會的焦點。NumPy 和它的 API 已經無處不在了。

數組激增和互操作性

NumPy 在 CPU 上提供了內存內、多維和均勻鍵入(即單一指向和跨步的)的數組。NumPy 可以在嵌入式設備和世界上最大的超級計算機等機器上運行,其性能接近編譯語言。在大多數情況下,NumPy 解決了絕大部分的數組計算用例。

但是現在,科學數據集通常超出單個機器的存儲容量,並且可以在多個機器或雲上存儲。此外,近來深度學習和人工智慧應用的加速需求已經促生了專用加速器硬體,包括 GPU、TPU 和 FPGA。目前,由於 NumPy 具有的內存內數據模型,它無法直接使用這類存儲和專用硬體。

然而,GPU、TPU 和 FPGA 的分布式數據和並行執行能夠很好地映射到數組編程範式,所以可用的現代硬體架構與利用它們的計算能力所必需的工具之間存在著差距。

社區為彌補這一差距做出的努力使得新的數組實現激增。例如,每個深度學習框架都創建了自己的數組。PyTorch、TensorFlow、Apache MXNet 和 JAX 數組都有能力以分布式方式在 CPU 和 GPU 上運行,其中使用惰性計算(lazy evaluation)實現額外性能優化。SciPy 和 PyData/Sparse 都提供有稀疏數組,這些數組通常包含很少的非零值,並只在內存中存儲以提升效率。

此外,還有一些項目在 NumPy 數組上構建作為數據容器,並擴展相應功能。Dask 通過這種方式使分布式數組成為可能,而標記數組是通過 xarray 實現的。

這類庫常常模仿 NumPy API,以降低初學者準入門檻,並為更廣泛的社區提供穩定的數組編程接口。這反過來也會阻止一些破壞性分立(disruptive schism),如 Numeric 和 Numarray 之間的差異。

但是探索使用數組的新方法從本質上講是試驗性的,事實上,Theano 和 Caffe 等一些有前途的庫已經停止了開發。每當用戶決定嘗試一項新技術時,他們必須更改 import 語句,並確保新庫能夠實現他們當前使用的所有 NumPy API 部件。

在理想狀態下,用戶可以通過 NumPy 函數或語義在專用數組上進行操作,這樣他們可以編寫一次代碼,然後從 NumPy 數組、GPU 數組、分布式數組以及其他數組之間的切換中獲益。為了支持外部數組對象之間的數組操作,NumPy 增加了一項充當核心協調機制的功能,並提供指定的 API,具體如上圖 2 所示。

為了促進這種互操作性,NumPy 提供了允許專用數組傳遞給 NumPy 函數的「協議」,具體如下圖 3 所示。反過來,NumPy 根據需要將操作分派給原始庫。超過 400 個最流行的 NumPy 函數得到了支持。該協議通過 Dask、CuPy、xarray 和 PyData/Sparse 等廣泛使用的庫來實現。

得益於這些進展,用戶現在可以使用 Dask 將自己的計算從單個機器擴展至多個系統。該協議允許用戶通過 Dask 數組中嵌入的 CuPy 數組等,在分布式多 GPU 系統上大規模地重新部署 NumPy 代碼。

使用 NumPy 的高級 API,用戶可以在具有數百萬個核的多系統上利用高度並行化的代碼執行,並且需要的代碼更改最少。

如下圖 3 所示,NumPy 的 API 和數組協議向生態系統提供了新的數組:

現在,這些數組協議是 NumPy 的主要特徵,它們的重要性預計也會越來越大。NumPy 開發者(很多也是這篇文章的作者)迭代地改善和增加協議設計,以改進實用性和簡化應用方式。

論文最後對 NumPy 的現狀和未來進行了總結和展望:

在未來十年中,NumPy 開發者將面臨多項挑戰。新設備將出現,現有的專用硬體將面臨摩爾定律的收益遞減,數據科學從業者將越來越多,類型也更加廣泛。而他們中的大部分將使用 NumPy。

隨著光片顯微鏡和大型綜合巡天望遠鏡(LSST)等設備和儀器的採用,科學數據的規模將持續擴大。新一代語言、解釋器和編譯器,如 Rust、Julia 和 LLVM,將創造出新的概念和數據結構。

如何根據任務需求搭配恰當類型的資料庫?

在AWS推出的白皮書《進入專用資料庫時代》中,介紹了8種資料庫類型:關係、鍵值、文檔、內存中、關係圖、時間序列、分類帳、領域寬列,並逐一分析了每種類型的優勢、挑戰與主要使用案例。

原標題:《15年!NumPy論文終出爐,還登上了Nature》

閱讀原文

相關焦點

  • NumPy論文登上Nature;高效Transformer綜述
    機器之心 & ArXiv Weekly Radiostation參與:杜偉、楚航、羅若天本周的重要論文包括 登上 Nature 的 NumPy 論文,以及高效 Transformer 綜述論文。
  • 榮登Nature,時隔15年NumPy論文終發表!
    早在上世紀90年代還沒有NumPy的時候,當時流行的是「Numeric」,它是基於C語言編寫的,在Python中提供了數組對象和array-aware函數。它最早的用途之一是引導 C+ + 應用於勞倫斯利弗莫爾國家實驗室的慣性約束聚變研究。
  • 21世紀以來,登上Nature雜誌封面的13篇中國論文
    今天,一起來回顧一下2000年以後,那些登上Nature封面的激動人心的中國研究成果吧。 論文地址:https://www.nature.com/articles/nature21691
  • 首個室溫超導體登上 Nature 封面!15°C 刷新紀錄,超高壓下展現超導特性
    23.2K(-249.95 攝氏度);1986 年,科學家發現一種陶瓷性金屬氧化物具有高溫超導性,臨界溫度可達 35K(-238.15 攝氏度),由此獲得了 1987 年的諾貝爾物理學獎;1988 年,科學家發現汞系超導材料的臨界溫度達 135K(-138.15 攝氏度);高壓條件下其臨界溫度將能達到
  • 最快被撤稿的Nature封面論文:邢立達等撤回琥珀中發現恐龍的論文
    2020年3月12日,中國地質大學邢立達及其合作者在 Nature 雜誌發表了封面論文,報導了報導了在琥珀中發現的「世界最小恐龍」,該研究成果很快被廣泛報導,並引起了較大關注。論文揭示了恐龍中前所未有的極端「小型化」現象,以及「過去未知的身體藍圖」和「未知的生態(類型)」,可以說是一項很有趣的發現,因此該論文不僅登上了國際頂尖學術期刊 Nature ,還被選為封面論文,據BioWorld統計,21世紀以來,我國學者僅有15篇論文登上Nature封面(包括這一篇)。
  • 幸福來得很突然,中山大學兩篇論文同一日被《nature》Online發表
    中山大學校長羅俊團隊論文 中山大學新任校長帶來的捷報2018年8月29日,國際權威期刊《nature》刊登了通訊作者為中山大學新任校長羅俊,物理與天文學院,青年教授薛超為並列一作的論文《Measurements
  • 15℃!人類首次實現高壓下室溫超導,研究登上Nature封面
    機器之心報導機器之心編輯部15℃,差不多是這幾天北京的溫度。「室溫超導有可能實現嗎?」這個問題困惑了人們許多年。這項研究從投稿到接收僅用了不到十天的時間,並登上了最新一期 Nature 雜誌的封面,或可說明其重要性和突破性,畢竟實現室溫超導對於人類而言尚屬首次。超導現象是指材料在低於某一溫度時,電阻變為零的現象,而這一溫度稱為超導轉變溫度(Tc)。超導現象的特徵是零電阻和完全抗磁性,這一特徵也使得超導在現實中得以應用,但它對溫度有較為嚴格的要求。
  • 新加坡81人登上「2020年被高度引用的科學家名單」
    「2020年被高度引用的科學家名單」出爐,這是全球領先的專業信息服務提供商科睿唯安(Clarivate Analytics)連續第七年發布該名單。入榜的自然科學家和社會科學家均發表了多篇被高度引用的論文,被引用的次數在同儕中排名前1%,彰顯他們的重要學術影響力。  無庸置疑,在知識的競賽中,人才是最重要的致勝關鍵。
  • Numpy學習打卡task03
    Fisher最重要的著作是1918年的開創性論文《孟德爾遺傳假設下親屬間的相關性》(第一次使用統計學術語--方差),1925年的經典著作《研究工作者的統計方法》和1935年的《實驗設計》,他發展了嚴格的實驗設計模型並首創了充分性、輔助統計、費雪線性判別器和費雪信息等概念。 在1930年出版的《自然選擇的遺傳理論》一書中,他將統計學應用於各種生物學概念,如費雪原理(A. W. F.
  • 《環球科學》網站上線「nature專區」,可免費閱讀nature完整論文
    在「nature專區」可查看每期《自然》學術論文的中文摘要,點擊每篇摘要後附帶的連結,網頁會自動跳轉至《自然》論文的全文頁面,供用戶閱讀論文。隨著《環球科學》「nature專區」的開通,中國用戶只需登錄環球科學官網www.huanqiukexue.com/,在「nature專區」即可查看每期《自然》學術論文的中文摘要,點擊每篇摘要後附帶的連結,即可閱讀論文全文(網頁會首先跳轉到nature官網的英文摘要頁面,之後nature會識別從www.huanqiukexue.com跳轉過來的連結,隨後跳轉到論文全文的PDF頁面。
  • 首個室溫超導體登上 Nature 封面!15°C 刷新紀錄,超高壓下展現...
    23.2K(-249.95 攝氏度);1986 年,科學家發現一種陶瓷性金屬氧化物具有高溫超導性,臨界溫度可達 35K(-238.15 攝氏度),由此獲得了 1987 年的諾貝爾物理學獎;1988 年,科學家發現汞系超導材料的臨界溫度達 135K(-138.15 攝氏度);高壓條件下其臨界溫度將能達到 164K(-109.15 攝氏度);
  • 中國少年連發兩篇Nature震驚世界,為什麼中國論文要發英文期刊?
    更加值得注意的是,曹原是第一篇論文的第一作者,以及和導師共同為文章通訊作者。在第二篇論文中曹原和其他兩位作者並列為第一作者。《Nature》論文,論文發表之後立即引起整個物理學界的反響,一些報導稱其一舉解決了困擾世界107年的難題。
  • 2020年全球頂級論文排行名單出爐:中科院位居榜首
    2020-12-31 06:50:59 來源: 花花圖集 舉報   2020年全球頂級論文排行名單出爐
  • Numpy高級操作大全!!!
    import numpy as npa = np.arange(0, 60, 5)a = a.reshape(3, 4)print(a)for x in np.nditer(a):    print(x)[[ 0 5 10 15] [20 25 30 35] [40 45 50 55]]
  • 15℃!人類首次實現高壓下室溫超導,研究登上Nature封面
    機器之心報導機器之心編輯部15℃,差不多是這幾天北京的溫度。這個問題困惑了人們許多年。而最新一期的 Nature 雜誌封面研究給出了肯定的答案,該研究製造出了第一個無需冷卻即可使電阻消失的超導體。這項研究從投稿到接收僅用了不到十天的時間,並登上了最新一期 Nature 雜誌的封面,或可說明其重要性和突破性,畢竟實現室溫超導對於人類而言尚屬首次。
  • Numpy入門詳細教程
    平時雖然一直在用,也看過很多教程,但紙上得來終覺淺,還是需要自己系統梳理總結才能印象深刻。本篇先從numpy開始,對numpy常用的方法進行思維導圖式梳理,多數方法僅拉單列表,部分接口輔以解釋說明及代碼案例。最後分享了個人關於axis和廣播機制的理解。
  • 頂尖SCI論文有多難?直到2015年武漢大學才斬獲第一篇《nature》
    頭版首頁的論文2020年3月11日,世界頂級科技期刊《nature》在線發表了武漢大學物理科學與技術學院袁聲軍教授與國內外研究團隊關於石墨烯氣體通透極限的最新研究成果,武漢大學用頭版首頁的新聞做了報導,雖然石墨烯屬於非常熱度高的材料學科,但是該篇論文並不是屬於材料化工領域灌水的應用論文
  • Python Numpy-數組的常用函數
    as nparr = np.random.randint(1,100,size=(6,5))print(arr)>>>array([[12, 88, 38, 77, 24],[54, 71, 17, 55, 30],[36, 45, 87, 68, 25],[35, 24, 96, 9, 35],[75, 15, 13, 97, 77],[72, 81, 84,
  • Numpy應用整理
    numpy簡介numpy是python最為常用的庫,沒有之一,它表示Numeric Python,從名字也可以看出來,它被用來做數值計算,常與scipy配合使用。現在幾乎各種應用場合都會用到numpy,主要有以下幾個原因:numpy提供了很多數值計算和常用算法的函數numpy歸功了很多線性代數的相關操作numpy的執行效率高首先導入numpy庫import numpy as np常規列表應用用numpy建的列表類型都是ndarray,因此我們首先來看np.array
  • Numpy入門教程:10. 統計相關
    【例】計算最小值import numpy as npx = np.array([[11, 12, 13, 14, 15],              [16, 17, 18, 19, 20],              [21, 22, 23, 24, 25],              [26, 27, 28, 29,