一、概述
在Numpy中當數組進行運算時,如果兩個數組的形狀相同,那麼兩個數組相乘就是兩個數組的對應位相乘,這是要求維數相乘,並且各維度的長度相同,但是當運算中兩個數組的形狀不同使時,numpy將會自動觸發廣播機制,所以我們要了解numpy的廣播機制,才能更好的進行數組的運算。
二、Numpy中的廣播
1、什麼是廣播
我們都知道,Numpy中的基本運算(加、減、乘、除、求餘等等)都是元素級別的,但是這僅僅侷限於兩個數組的形狀相同的情況下。
可是大家又會發現,如果讓一個數組加1的話,結果時整個數組的結果都會加1,這是什麼情況呢?
其實這就是廣播機制:Numpy 可以轉換這些形狀不同的數組,使它們都具有相同的大小,然後再對它們進行運算。下面是廣播示意圖:
術語廣播是指 NumPy 在算術運算期間處理不同形狀的數組的能力。對數組的算術運算通常在 相應的元素上進行。如果兩個陣列具有完全相同的形狀,則這些操作被無縫執行。
如果兩個數組的維數不相同,則元素到元素的操作是不可能的。然而,在 NumPy 中仍然可以對形狀不相似的數組進行操作,因爲它擁有廣播功能。較小的數組會廣播到較大數組的大小,以便使它們的形狀可兼容。
如果滿足以下條件之一,那麼數組被稱爲可廣播的。
- 數組擁有相同形狀。數組擁有相同的維數,且某一個或多個維度長度爲 1 。數組擁有極少的維度,可以在其前面追加長度爲 1 的維度,使上述條件成立
廣播的規則:
- 規則 1:如果兩個數組的維度數不相同,那麼小維度數組的形狀將會在最左邊補 1。規則 2:如果兩個數組的形狀在任何一個維度上都不匹配,那麼數組的形狀會沿着維度 爲 1 的維度擴展以匹配另外一個數組的形狀。規則 3:如果兩個數組的形狀在任何一個維度上都不匹配並且沒有任何一個維度等於 1, 那麼會引發異常。
1.1、形狀相同的廣播
1.2、相同維度,但其中某一個或多個維度長度爲 1 的廣播:
1.3、較少的維度,默認在其前面追加長度爲 1 的維度:
1.4、如果是標量的話,會廣播整個數組上:
2、廣播示例
2.1、將數組賦值給a並查看數組的形狀
2.2、將數組賦值給b並查看數組的形狀
2.3、將數組a轉換爲4行1列
2.4、數組a+b,並查看形狀
明顯可以看出,相加前 a 的形狀爲 (4, 1), b 的形狀爲 (3, ), a+b 的結果的形狀爲(4, 3)。計算時,變換結果與上圖類似,這裏來詳細介紹下:
2.5、現在嘗試模擬一個廣播的方式, 把a中的每個元素拉長三倍
2.6、b 中的元素拉長4倍
2.7、aa+bb
2.8、a+b
這裏我們就能看出,我們將數組擴展到較大的維度再進行通用函數操作,和我們直接進行廣播操作結果是一樣的。
三、Numpy中的運算
1、算術運算
Numpy中用於執行算術運算(如 add() ,subtract() ,multiply() 和 divide() )的輸入數組必須具 有相同的形狀或符合數組廣播規則。
常用數學運算函數:
數學運算函數
add(x1,x2 )
按元素添加參數,等效於 x1 + x2
subtract(x1,x2)
按元素方式減去參數,等效於x1 - x2
multiply(x1,x2)
逐元素乘法參數,等效於x1 * x2
divide(x1,x2)
逐元素除以參數,等效於x1 / x2
exp(x)
計算e的x次方。
exp2(x)
計算2的x次方。
power(x1,x2)
計算x1的x2次冪。
mod(x)
返回輸入數組中相應元素的除法餘數.
log(x)
自然對數,逐元素。
log2(x)
x的基礎2對數。
log10(x)
以元素爲單位返回輸入數組的基數10的對數。
expm1(x)
對數組中的所有元素計算exp(x) - 1
log1p(x)
返回一個加自然對數的輸入數組。
sqrt(x)
按元素方式返回數組的正平方根。
square(x)
返回輸入的元素平方。
sin(x)
三角正弦。
cos(x)
元素餘弦。
tan(x)
逐元素計算切線。
1.1、生成一個3行3列元素類型爲浮點型的數組和一個1行3列的數組
1.2、執行數組加法
1.3、執行數組減法
1.4、執行數組的乘法
1.5、執行數組的除法
1.6、numpy.reciprocal()
此函數返回參數逐元素的倒數,由於 Python 處理整數除法的方式,對於絕對值大於 1 的整數 元素,結果始終爲 0,對於整數 0,則發出溢出警告。
1.7、進行指數運算
1.8、執行冪運算
1.9、numpy.mod()
此函數返回輸入數組中相應元素的除法餘數。函數 numpy.remainder() 也產生相同的結果。
1.10、對含有複數的數組進行執行的函數
- numpy.real() 返回複數類型參數的實部。numpy.imag() 返回複數類型參數的虛部。
- numpy.conj() 返回通過改變虛部的符號而獲得的共軛複數。
- numpy.angle() 返回複數參數的角度。函數的參數是 degree 。如果爲 true,返回的角度以角度制來表示,否則爲以弧度制來表示。
1.11、執行三角函數
- 補充numpy.around()
這個函數返回四捨五入到所需精度的值。decimals 表示要舍入的小數位數。默認值爲 0。如果 爲負,整數將四捨五入到小數點左側的位置
同pyhon內置一樣,在進行舍入的時候需要注意二進制小數的精度問題
- numpy.floor() 向下取整
此函數返回不大於輸入參數的最大整數。即標量 x 的下限是最大的整數 i ,使得 i <= x。注意 在 Python 中,向下取整總是從 0 舍入。
- numpy.ceil()向上取整
本函數返回輸入值的上限,即,標量 x 的上限是最小的整數 i ,使得 i> = x。
2、字符串函數
以下函數用於對 dtype 爲 numpy.string 或 numpy.unicode 的數組執行向量化字符串操作。 它們基於 Python 內置庫中的標準字符串函數。
2.1、numpy.char.add()
函數執行按元素的字符串連接:
2.2、numpy.char.multiply()
這個函數執行多重連接:
2.3、numpy.char.center()
此函數返回所需寬度的數組,以便輸入字符串位於中心,並使用 fillchar 在左側和右側進行填充:
2.4、numpy.char.capitalize()
函數返回字符串的副本,其中第一個字母大寫:
2.5、numpy.char.title()
返回輸入字符串的按元素標題轉換版本,其中每個單詞的首字母都大寫:
2.6、numpy.char.lower()
函數返回一個數組,其元素轉換爲小寫。它對每個元素調用 str.lower:
2.7、numpy.char.upper()
函數返回一個數組,其元素轉換爲大寫。它對每個元素調用 str.upper:
2.8、numpy.char.split()
此函數返回輸入字符串中的單詞列表。默認情況下,空格用作分隔符。否則,指定的分隔符字符用於分割字符串:
2.9、numpy.char.splitlines()
函數返回數組中元素的單詞列表,以換行符分割:' ',' ',' ' 都被當做換行符處理。
2.10、numpy.char.strip()
函數返回數組的副本,其中元素移除了開頭或結尾處的特定字符:
2.11、numpy.char.join()
這個函數返回一個字符串,其中單個字符由特定的分隔符連接:
2.12、numpy.char.replace()
這個函數返回字符串副本,其中所有字符序列的出現位置都被另一個給定的字符序列取代:
3、統計函數
NumPy有很多有用的統計函數,用於從數組中給定的元素中查找最小,最大,百分標準差和方差等。
常用統計函數
numpy.amin()
從給定數組中的元素沿指定軸返回最小值
numpy.amax()
從給定數組中的元素沿指定軸返回最大值
numpy.ptp()
返回沿軸的值的極差(最大值 - 最小值)
numpy.percentile()
返回特定軸的百分位數
numpy.median()
返回數組中值
numpy.mean()
返回數組的算術平均值
numpy.average()
返回數組的加權平均值
numpy.std()
返回數組的標準差
numpy.var()
返回數組的方差
3.1、numpy.amin() 和 numpy.amax()
這些函數從給定數組中的元素沿指定軸返回最小值和最大值。
3.3、numpy.ptp()
本函數返回沿軸的值的極差(最大值 - 最小值)。
3.4、numpy.percentile()
百分位數是統計中使用的度量,表示小於這個值得觀察值佔某個百分比。函數numpy.percentile() 接受以下參數。
numpy.percentile(a, q, axis):
- a 輸入數組q 要計算的百分位數,在 0 ~ 100 之間axis 沿着它計算百分位數的軸
3.5、numpy.median()
中值定義爲將數據樣本的上半部分與下半部分分開的值。
3.6、numpy.mean()
算術平均值是沿軸的元素的總和除以元素的數量。函數返回數組中元素的算術平均值。如果提供了軸,則沿其計算。
3.7、numpy.average()
加權平均值是由每個分量乘以反映其重要性的因子得到的平均值。函數根據在另一個數組中給出的各自的權重計算數組中元素的加權平均值。該函數可以接受一個軸參數。如果沒有指定軸,則數組會被展開。
考慮數組 [1,2,3,4] 和相應的權重 [4,3,2,1] ,通過將相應元素的乘積相加,並將和除以權重的和,來計算加權平均值。
加權平均值 = (1*4+2*3+3*2+4*1)/(4+3+2+1)
不指定權重時相當於mean函數
如果returned參數設爲true,則返回權重的和
3.8、numpy.std()
標準差是與均值的偏差的平方的平均值的平方根。標準差公式如下: std = sqrt(mean((x - x.mean())**2))
方差是偏差的平方的平均值,即mean((x - x.mean())** 2)。換句話說,標準差是方差的平方根。
4、排序、搜索和計數函數
4.1、numpy.sort()函數返回輸入數組的排序副本。
4.2、numpy.argsort()
函數對輸入數組沿給定軸執行間接排序,並使用指定排序類型返回數據的索引數組。這個索引 數組用於構造排序後的數組。
4.3、numpy.lexsort()
函數使用鍵序列執行間接排序。鍵可以看作是電子表格中的一列。該函數返回一個索引數組,使用它可以獲得排序數據。注意,最後一個鍵恰好是 sort 的主鍵。
4.4、numpy.argmax() 和 numpy.argmin()
這兩個函數分別沿給定軸返回最大和最小元素的索引
4.5、numpy.nonzero()
函數返回輸入數組中非零元素的索引。
4.6、numpy.where()
函數返回輸入數組中滿足給定條件的元素的索引。
4.7、numpy.extract()
函數返回滿足任何條件的元素。
5、轉置
Numpy 的轉置可以按照你的需要對數組的軸進行轉換。
需要注意的是,轉置只能發生在二維及以上的維度的數組上生效,一維的數組只有一個維度是 不可以轉置的。
6、唯一化和集合邏輯
- np.unique() 去重函數np.in1d() 驗證元素是否在給定序列中np.intersect1d() 求交集np.union1d() 求並集np.setdiff1d() 求差集
6.1去重
- 字符串去重
- 整數去重
- 布爾值去重
- 布爾值的any()和all()函數
6.2、檢驗元素
6.3、求交集
6.4、求並集
6.5、求差集