Python-NumPy模塊的通用函數(3)
1.前言
通用函數(即ufunc)是一種對ndarray中的數據執行元素級運算的函數,那什麼是元素級的運算呢?其實在我看來就是這裡的函數對數組中的每一個元素值作用然後產生新的元素值,返回新的元素值組成的數組。你可以將其看做簡單函數(接受一個或者多個標量值,併產生一個或者多個標量值)的矢量化包裝器。下面我們看一個簡單的例子:
import numpy as nparray = np.arange(4).reshape((2,2))print("-----源數據-----")print(array)print("-----exp()通用函數作用-----")array_exp = np.exp(array)print(array_exp)-----源數據-----[[0 1] [2 3]]-----exp()通用函數作用-----[[ 1. 2.71828183] [ 7.3890561 20.08553692]]
我們需要注意:
- 我們的exp()操作對源數組中的每個元素都進行了 的指數操作,這就很好的說明了我們的通用函數是一種對ndarray中的數據執行元素級運算的函數;
- 我們大概知道在Python中有一個內置模塊math模塊,這個模塊中包含了一些基本的一些數學運算,其中就有math.exp()。我們知道對於深度學習來說有一個很重要的激活函數sigmoid函數,那麼為什麼我們沒有使用math.exp()來計算sigmoid函數呢?其實理由很簡單,我們的math模塊是Python內置的模塊,他只能對標量進行操作(當然即使是list數據類型也不行)。但是對於我們的深度學習來說,我們常用大量的矩陣運算來矢量化數據。所以Python的內置模塊math遠遠不能滿足我們的需求。所以我們在深度學習中才需要使用Numpy中的exp通用函數,我們不僅能傳遞數組給他進行元素級的運算,而且我們也可以傳入標量,比math模塊提供的exp更加高效。
2.通用函數的分類
通用函數(ufunc)有兩種類別:
- 一元(unary)ufunc,他們接受一個數組。返回一個結果數組,當然也能返回兩個數組(modf函數),但是這種的不是很常見;
- 二元(binary)ufunc,他們接受兩個數組,並返回一個結果數組。
一元ufunc中的第一個是abs與fabs他們有什麼區別呢?
import numpy as npprint(-----abs-----)a = np.abs([-1,-2,-3])print(a.dtype)a = np.abs([-1.2,-2.2,-3.3])print(a.dtype)a = np.abs(3+4j)print(a.dtype)print(-----fabs-----)f = np.fabs([-1,-2,-3])print(f.dtype)f = np.fabs([-1.2,-2.2,-3.3])print(f.dtype)f = np.fabs(3+4j)print(f.dtype)-----abs-----int32float64float64-----fabs-----float64float64Traceback (most recent call last): File "G:/Python源碼/numpy_test/numpy_test.py", line 1087, in <module> f = np.fabs(3+4j)TypeError: ufunc fabs not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule safe
從上面代碼可以看出:
1.abs和fabs都是取絕對值的函數。對於fabs函數來說。如果數據可以轉換成float的話,他會將數據轉換成float類型,然後去絕對值。當然如果不能轉換就會拋出異常。2.還有一點需要注意的就是fabs函數是不能去操作複數的。而abs可以處理複數。
import numpy as npx = np.random.randn(8)y = np.random.randn(8)print(x)print(y)print(----------)array = np.maximum(x,y)print(array)[ 2.39382031 0.64527799 1.01170366 -0.07116423 0.40962236 -0.63333263 -0.98736115 -0.67162906][ 0.59509196 -0.30740723 -1.59124219 -0.60960202 0.64756039 2.35825079 -0.80191374 0.4045955 ]----------[ 2.39382031 0.64527799 1.01170366 -0.07116423 0.64756039 2.35825079 -0.80191374 0.4045955 ]
還有一種不是很常見的ufunc,他能夠返回多個數組。modf就是一個例子,他是python內置函數divmod的矢量化版本,用於浮點數數組的小數和整數部分。
import numpy as nparray = np.random.randn(7)*5print(array)print(----------)array = np.modf(array)print(type(array))print(array)[ 7.3704017 -14.69991603 -2.88312289 -3.171596 5.99889683 -4.96691054 2.305141 ]----------<class tuple>(array([ 0.3704017 , -0.69991603, -0.88312289, -0.171596 , 0.99889683, -0.96691054, 0.305141 ]), array([ 7., -14., -2., -3., 5.,
推薦閱讀:
※如何看待微軟 Pyjion 的進展以及 CPython 性能優化的未來?
※第十章 Scrapy的架構初探
※Python 網路爬蟲入門(四)— 破解pexels高清原圖 (附源碼)
※excel中想實現使用Python代替VBA,請問應該怎麼做?
※Python裝飾器