NumPy 1.3.0 發行說明#
這個小版本包含了大量的錯誤修正、官方 Python 2.6 支援,以及幾個新功能,例如廣義通用函數 (generalized ufuncs)。
重點摘要#
Python 2.6 支援#
Python 2.6 現在在所有先前支援的平台(包括 Windows)上都受到支援。
廣義通用函數 (Generalized ufuncs)#
對於不僅對純量執行運算,也對向量(或陣列)執行運算的函數,存在普遍的需求,如 http://scipy.org/scipy/numpy/wiki/GeneralLoopingFunctions 中所述。我們提議透過推廣通用函數 (universal functions, ufuncs) 來實現這個概念,並提供一個 C 語言實作,為 numpy 程式碼庫增加約 500 行程式碼。在目前(特定)的通用函數中,基本函數僅限於逐元素運算,而廣義版本支援「子陣列」對「子陣列」的運算。Perl 向量函式庫 PDL 提供了類似的功能,以下將重複使用其術語。
每個廣義通用函數都有與之相關的資訊,說明輸入的「核心」維度,以及對應輸出的維度(逐元素的通用函數具有零核心維度)。所有引數的核心維度列表稱為通用函數的「簽名」。例如,通用函數 numpy.add 的簽名為「(),()->()」,定義了兩個純量輸入和一個純量輸出。
另一個範例是(請參閱 GeneralLoopingFunctions 頁面)簽名為「(i),(i)->()」的函數 inner1d(a,b)。這會沿著每個輸入的最後一個軸套用內積,但保持其餘索引不變。例如,當 a 的形狀為 (3,5,N) 且 b 的形狀為 (5,N) 時,這將傳回形狀為 (3,5) 的輸出。底層基本函數被呼叫 3*5 次。在簽名中,我們為每個輸入指定一個核心維度「(i)」,為輸出指定零核心維度「()」,因為它接受兩個一維陣列並傳回一個純量。透過使用相同的名稱「i」,我們指定兩個對應的維度應該具有相同的大小(或者其中一個的大小為 1,將會被廣播)。
超出核心維度的維度稱為「迴圈」維度。在上面的範例中,這對應於 (3,5)。
通常的 numpy「廣播」規則適用,其中簽名決定了每個輸入/輸出物件的維度如何分割為核心維度和迴圈維度
當輸入陣列的維度小於對應的核心維度數量時,會在其形狀前面加上 1。核心維度會從所有輸入中移除,剩餘的維度會被廣播;定義迴圈維度。輸出由迴圈維度加上輸出核心維度給出。
實驗性 Windows 64 位元支援#
Numpy 現在可以在 Windows 64 位元(僅限 amd64,不包括 IA64)上使用 MS 編譯器和 mingw-w64 編譯器進行建置
這是高度實驗性:請勿用於生產環境。有關限制以及如何自行建置的更多資訊,請參閱 INSTALL.txt 中的 Windows 64 位元區段。
新功能#
格式化問題#
浮點數格式化現在由 numpy 而非 C 執行階段處理:這實現了與地區設定無關的格式化,以及更穩健的 fromstring 和相關方法。特殊值(inf 和 nan)在不同平台之間也更一致(nan vs IND/NaN 等),並且與最近的 python 格式化工作(在 2.6 及更高版本中)更加一致。
max/min 中的 Nan 處理#
maximum/minimum 通用函數現在可以可靠地傳播 nan。如果其中一個引數是 nan,則傳回 nan。這會影響 np.min/np.max、amin/amax 和陣列方法 max/min。已新增新的通用函數 fmax 和 fmin 來處理非傳播 nan。
sign 中的 Nan 處理#
通用函數 sign 現在會為 anan 的符號傳回 nan。
新的通用函數#
fmax - 與整數類型和非 nan 浮點數的最大值相同。如果一個引數是 nan,則傳回非 nan 引數;如果兩個引數都是 nan,則傳回 nan。
fmin - 與整數類型和非 nan 浮點數的最小值相同。如果一個引數是 nan,則傳回非 nan 引數;如果兩個引數都是 nan,則傳回 nan。
deg2rad - 將度數轉換為弧度,與 radians 通用函數相同。
rad2deg - 將弧度轉換為度數,與 degrees 通用函數相同。
log2 - 以 2 為底的對數。
exp2 - 以 2 為底的指數。
trunc - 將浮點數截斷為趨近於零的最接近整數。
logaddexp - 將以對數形式儲存的數字相加,並傳回結果的對數。
logaddexp2 - 將以 2 為底的對數形式儲存的數字相加,並傳回結果以 2 為底的對數。
遮罩陣列 (Masked arrays)#
多項新功能與錯誤修正,包括
結構化陣列現在應完全受到 MaskedArray 的支援 (r6463, r6324, r6305, r6300, r6294…)
次要錯誤修正 (r6356, r6352, r6335, r6299, r6298)
改進了對 __iter__ 的支援 (r6326)
使 baseclass、sharedmask 和 hardmask 可供使用者存取(但為唯讀)
文件更新
gfortran 在 Windows 上的支援#
即使 C 編譯器是 Visual Studio(VS 2005 及更高版本;VS 2003 無法運作),Gfortran 現在也可以在 Windows 上用作 numpy 的 fortran 編譯器。Gfortran + Visual studio 在 Windows 64 位元上無法運作(但 gcc + gfortran 可以)。目前尚不清楚是否有可能在 x64 上同時使用 gfortran 和 visual studio。
Windows 二進位檔的 Arch 選項#
現在可以從命令列繞過已安裝的超級封裝 (superpack) 的自動架構偵測
numpy-1.3.0-superpack-win32.exe /arch=nosse
將安裝一個適用於任何 x86 的 numpy,即使正在執行的電腦支援 SSE 指令集。
已棄用的功能#
直方圖 (Histogram)#
直方圖的語意已修改,以修正長期以來處理離群值的問題。主要的變更涉及
bin 邊緣的定義,現在包括最右邊的邊緣,以及
對上限離群值的處理,現在會被忽略,而不是計入最右邊的 bin 中。
先前的行為仍然可以使用 new=False 存取,但這已被棄用,並將在 1.4.0 中完全移除。
文件變更#
已新增大量文件。使用者指南和參考資料都可以從 sphinx 建置。
新的 C API#
Multiarray API#
以下函數已新增至 multiarray C API
PyArray_GetEndianness:取得執行階段位元組順序
Ufunc API#
以下函數已新增至 ufunc API
PyUFunc_FromFuncAndDataAndSignature:宣告更通用的 ufunc(廣義通用函數)。
新的定義 (defines)#
新的公開 C 定義可用於透過 numpy/npy_cpu.h 的 ARCH 特定程式碼
NPY_CPU_X86:x86 架構(32 位元)
NPY_CPU_AMD64:amd64 架構(x86_64,非 Itanium)
NPY_CPU_PPC:32 位元 ppc
NPY_CPU_PPC64:64 位元 ppc
NPY_CPU_SPARC:32 位元 sparc
NPY_CPU_SPARC64:64 位元 sparc
NPY_CPU_S390:S390
NPY_CPU_IA64:ia64
NPY_CPU_PARISC:PARISC
也新增了用於 CPU 位元組順序的新巨集(詳細資訊請參閱下面的內部變更)
NPY_BYTE_ORDER:整數
NPY_LITTLE_ENDIAN/NPY_BIG_ENDIAN 定義
這些為沒有 glibc endian.h 巨集的平台提供了可攜式的替代方案。
可攜式 NAN、INFINITY 等…#
npy_math.h 現在提供多個可攜式巨集來取得 NAN、INFINITY
NPY_NAN:相當於 NAN,它是 GNU 擴充功能
NPY_INFINITY:相當於 C99 INFINITY
NPY_PZERO、NPY_NZERO:分別為正零和負零
也提供了對應的單精度和擴展精度巨集。為了保持一致性,已移除所有對 NAN 的參考,或即時本機計算 NAN 的程式碼。
內部變更#
numpy.core 數學配置重組#
這應該使移植到新平台變得更容易且更穩健。特別是,配置階段不需要在目標平台上執行任何程式碼,這是邁向跨編譯的第一步。
https://numpy.dev.org.tw/neps/nep-0003-math_config_clean.html
umath 重構#
針對 umath/ufunc 程式碼進行了大量程式碼清理 (charris)。
改進了建置警告#
Numpy 現在可以使用 -W -Wall 建置,而不會產生警告
獨立的核心數學函式庫#
核心數學函數(sin、cos 等…適用於基本 C 類型)已放入獨立的函式庫中;它充當相容性層,以支援大多數 C99 數學函數(目前僅限實數)。該函式庫包含針對各種數學函數的平台特定修正,例如,使用這些版本應該比直接使用平台函數更穩健。現有函數的 API 與 C99 數學函數 API 完全相同;唯一的區別是 npy 字首(npy_cos vs cos)。
核心函式庫將在 1.4.0 中提供給任何擴充功能使用。
CPU 架構偵測#
npy_cpu.h 定義了 numpy 特定的 CPU 定義,例如 NPY_CPU_X86 等… 這些定義可跨 OS 和工具鏈移植,並在標頭檔被解析時設定,以便即使在跨編譯的情況下(值在建置 numpy 時未設定),或對於多架構二進位檔(例如 Max OS X 上的胖二進位檔)也可以安全地使用。
npy_endian.h 定義了 numpy 特定的位元組順序定義,以 glibc endian.h 為模型。NPY_BYTE_ORDER 等同於 BYTE_ORDER,並且定義了 NPY_LITTLE_ENDIAN 或 NPY_BIG_ENDIAN 之一。至於 CPU 架構,這些定義在標頭檔被編譯器解析時設定,因此可用於跨編譯和多架構二進位檔。