首頁>技術>

簡介

NumPy是Python中非常優秀的一個數據科學工具包,使用Python做資料分析的童鞋幾乎是必備的工具。NumPy的提供了非常豐富的計算能力,但是底層是C語言實現的,因此既有Python語法的低門檻,速度上卻依然非常好。NumPy本身也和Pandas、SciPy一起成為一種生態了。

今天,NumPy釋出了1.20.0最新版本,這個版本的改動很大。值得童鞋們關注~

這個版本支援Python3.7-3.9(注意,3.6已經被拋棄了哦)。由184位貢獻者實現了684個PRs。主要的變化如下:

NumPy函式的註釋。這項工作還在進行中,預計會在使用者反饋的基礎上進行改進。更廣泛地使用SIMD來提高ufuncs的執行速度。在引入通用函式方面已經做了很多工作,這些通用函式將方便在不同硬體平臺上使用新功能。這項工作還在進行中。對dtype和casting實現的改造,以便為擴充套件dtypes提供一個更容易的途徑。這項工作還在進行中,但已經做了足夠的實驗和反饋。廣泛的文件改進,包括大約 185 個 PR 合併。這項工作正在進行中,是改進對新使用者有用性的大專案的一部分。進一步清理與移除 Python 2.7 有關的內容。這提高了程式碼的可讀性,並消除了一些技術債務。對即將到來的 Cython 3.0 的初步支援。

接下來,我們看看其中比較重要的一些內容

一、NumPy1.20.0的新函式1.1、陣列新的“洗牌”方法

首先我們看一下隨機生成器裡面新增的一個方法,即permuted方法。終於新增了一個這樣實用的按維度隨機重排陣列的方法了。

在此之前已經有shuffle和permutation了,這兩個方法是對陣列進行進行隨機重排列的方法,區別在於一個是陣列本身重排列,另一個是重排列結果返回一個副本。但是這兩個隨機重排列的方法都只能針對陣列中的某一個維度,也就是說只能隨機重排某一個維度下的陣列。對於多維資料,如二維資料為例,它只能讓所有的行或者列都按一種方式重排。

如下的例子:

>>> rg = np.random.default_rng()>>> x = np.arange(0, 15).reshape(3, 5)>>> xarray([[ 0,  1,  2,  3,  4],       [ 5,  6,  7,  8,  9],       [10, 11, 12, 13, 14]])>>> rg.permutation(x, axis=1)array([[ 1,  3,  2,  0,  4],  # random       [ 6,  8,  7,  5,  9],       [11, 13, 12, 10, 14]])

可以看到,這種重排方式就是第0列變成了第3列,第2列變成了第0列,等等。

而新增的permuted方法則可以每一個維度獨立重排。

>>> rg.permuted(x, axis=1)array([[ 1,  0,  2,  4,  3],  # random       [ 5,  7,  6,  9,  8],       [10, 14, 12, 13, 11]])

可以看到,每一行都是相互獨立的隨機重排了。

1.2、新增滑動視窗檢視方法

在一些與時間有關的問題中,滑動視窗是一個非常重要的工具,比如從某一個時刻開始,一次按照多少步長滑動,到下一個時刻的資料中。新增的numpy.lib.stride_tricks.sliding_window_view 方法可以讓我們按照這種方式去檢視資料。此前,NumPy並沒有提供這樣的方法供我們使用,其它方法也都效率不太好。

當然這個問題本身就很麻煩,畢竟如果一個很大的序列,用一個視窗去滑動效率就不高,尤其是序列很長,視窗很小的時候,目前NumPy提供的這個方法算是一個比較高效的解決方案了。

示例如下:

>>> x = np.arange(6)>>> x.shape(6,)>>> v = sliding_window_view(x, 3)>>> v.shape(4, 3)>>> varray([[0, 1, 2],       [1, 2, 3],       [2, 3, 4],       [3, 4, 5]])

更多細節,就等童鞋們自己挖掘了。

1.3、新增broadcasting使用者介面

broadcasting是陣列計算中很重要的概念,在深度學習以及各種計算框架下,都使用了這樣一個概念。它告訴我們如何處理不同形狀之間陣列的計算,一般來說,是較小的陣列被broadcast較大的陣列中計算。但是對於使用者來說很多時候也許不太容易理解,這次新增的numpy.broadcast_shapes方法可以直接讓我們看到不同形狀的計算結果如何。

如下:

>>> np.broadcast_shapes((1, 2), (3, 1))(3, 2)>>> np.broadcast_shapes(2, (3, 1))(3, 2)>>> np.broadcast_shapes((6, 7), (5, 6, 1), (7,), (5, 1, 7))(5, 6, 7)

這可以幫助我們在構造計算時候更加清楚自己在做什麼,真的是新手的福音啊。哈哈。

二、廢棄的內容

這次新版本廢棄的東西還是需要大家注意的。對於之前編碼不太規範的童鞋來說,如果更新了,很多程式碼可能就有問題了。

2.1、廢棄np.int

首先是np.int被廢棄,這個是幾乎等同於Python內建的int方法。但是對於新手來說很容易困惑,類似這樣的方法還有np.float等。這次徹底廢棄了,讓大家不再困惑。

2.2、shape=None與shape=()開始不同

其次是方法中如果傳遞了shape=None的引數要注意,之前這個引數與shape=()是同等含義的。但是最新的方法中這兩者已經有區別了。如果之前有混用要注意。

2.3、超出索引值報錯

此外,如果索引為空的情況會被報錯,之前超出索引的情況返回了0,未來會報錯了。如下情況會報錯,目前會告警大家,需要注意。

arr1 = np.zeros((5, 0))arr1[[20]]arr2 = np.zeros((5, 5))arr2[[20], :0]
2.4、mode與searchside不支援錯誤拼寫

之前對於一些錯誤的引數,NumPy自動更正,以後會報錯了。如下:

import numpy as nparr = np.array([[3, 6, 6], [4, 5, 1]])# mode: inexact matchnp.ravel_multi_index(arr, (7, 6), mode="clap")  # should be "clip"# searchside: inexact matchnp.searchsorted(arr[0], 4, side='random')  # should be "right"
2.5、廢棄numpy.dual2.6、矩陣的outer方法被廢棄

16
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • JavaScript的基本語法-字元編碼