Numpy數組
Numpy是高性能科學計算和數據分析的基礎包。它也是pandas等其餘數據分析的工具的基礎,基本全部數據分析的包都用過它。NumPy爲Python帶來了真正的多維數組功能,而且提供了豐富的函數庫處理這些數組。它將經常使用的數學函數都支持向量化運算,使得這些數學函數可以直接對數組進行操做,將原本須要在Python級別進行的循環,放到C語言的運算中,明顯地提升了程序的運算速度。dom
安裝方法:ide
pip install numpy函數
引用方式:工具
import numpy as np性能
這是官方認證的導入方式,可能會有人說爲何不用from numpy import *
,是由於在numpy當中有一些方法與Python中自帶的一些方法,例如max
、min
等衝突,爲了不這些麻煩你們就約定俗成的都使用這種方法。大數據
Numpy的核心特徵就是N-維數組對——ndarray.ui
接下來咱們能夠經過具體的實例來展現一下ndarray的優點。
如今有這樣一個需求:spa
已知若干家跨國公司的市值(美圓),將其換算爲人民幣
按照Python當中的方法
第一種:是將全部的美圓經過for循環依次迭代出來,而後用每一個公司的市值乘以匯率
第二種:經過map方法和lambda函數映射設計
這些方法相對來講也挺好用的,可是再來看經過ndarray對象是如何計算的
經過ndarray這個多維數組對象可讓這些批量計算變得更加簡單,固然這隻它其中一種優點,接下來就經過具體的操做來發現。
np.array()
接下來就多維數組舉個例子:
有的人可能會說了,這個數組跟Python中的列表很像啊,它和列表有什麼區別呢?
屬性 | 描述 |
---|---|
T | 數組的轉置(對高維數組而言) |
dtype | 數組元素的數據類型 |
size | 數組元素的個數 |
ndim | 數組的維數 |
shape | 數組的維度大小(以元組形式) |
T:轉置 li1 = [ [1,2,3], [4,5,6] ] a = np.array(li1) a.T 執行結果: array([[1, 4], [2, 5], [3, 6]]) 就至關因而將行變成列,列變成行,它也是一個比較經常使用的方法
類型 | 描述 |
---|---|
布爾型 | bool_ |
整型 | int_ int8 int16 int32 int 64 |
無符號整型 | uint8 uint16 uint32 uint64 |
浮點型 | float_ float16 float32 float64 |
複數型 | complex_ complex64 complex128 |
整型: int32只能表示(-2**31,2**31-1),由於它只有32個位,只能表示2**32個數 無符號整型: 只能用來存正數,不能用來存負數 補充: astype()方法能夠修改數組的數據類型
方法 | 描述 |
---|---|
array() | 將列表轉換爲數組,可選擇顯式指定dtype |
arange() | range的numpy版,支持浮點數 |
linspace() | 相似arange(),第三個參數爲數組長度 |
zeros() | 根據指定形狀和dtype建立全0數組 |
ones() | 根據指定形狀和dtype建立全1數組 |
empty() | 根據指定形狀和dtype建立空數組(隨機值) |
eye() | 根據指定邊長和dtype建立單位矩陣 |
一、arange(): np.arange(1.2,10,0.4) 執行結果: array([1.2, 1.6, 2. , 2.4, 2.8, 3.2, 3.6, 4. , 4.4, 4.8, 5.2, 5.6, 6. , 6.4, 6.8, 7.2, 7.6, 8. , 8.4, 8.8, 9.2, 9.6]) # 在進行數據分析的時候一般咱們遇到小數的機會遠遠大於遇到整數的機會,這個方法與Python內置的range的使用方法同樣 ----------------------------------------------------------------- 二、linspace() np.linspace(1,10,20) 執行結果: array([ 1. , 1.47368421, 1.94736842, 2.42105263, 2.89473684, 3.36842105, 3.84210526, 4.31578947, 4.78947368, 5.26315789, 5.73684211, 6.21052632, 6.68421053, 7.15789474, 7.63157895, 8.10526316, 8.57894737, 9.05263158, 9.52631579, 10. ]) # 這個方法與arange有一些區別,arange是顧頭不顧尾,而這個方法是顧頭又顧尾,在1到10之間生成的二十個數每一個數字之間的距離相等的,先後兩個數作減法確定相等 ---------------------------------------------------------------- 三、zeros() np.zeros((3,4)) 執行結果: array([[0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.]]) # 會用0生成三行四列的一個多維數組 --------------------------------------------------------------------- 四、ones() np.ones((3,4)) 執行結果: array([[1., 1., 1., 1.], [1., 1., 1., 1.], [1., 1., 1., 1.]]) # 會用1生成三行四列的一個多維數組 ------------------------------------------------------------------------ 五、empty() np.empty(10) 執行結果: array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]) # 這個方法只申請內存,不給它賦值 ----------------------------------------------------------------------- 六、eye() np.eye(5) 執行結果: array([[1., 0., 0., 0., 0.], [0., 1., 0., 0., 0.], [0., 0., 1., 0., 0.], [0., 0., 0., 1., 0.], [0., 0., 0., 0., 1.]])
li1 = [ [1,2,3], [4,5,6] ] a = np.array(li1) a * 2 運行結果: array([[ 2, 4, 6], [ 8, 10, 12]])
# l2數組 l2 = [ [1,2,3], [4,5,6] ] a = np.array(l2) # l3數組 l3 = [ [7,8,9], [10,11,12] ] b = np.array(l3) a + b # 計算 執行結果: array([[ 8, 10, 12], [14, 16, 18]])
# 將一維數組變成二維數組 arr = np.arange(30).reshape(5,6) # 後面的參數6能夠改成-1,至關於佔位符,系統能夠自動幫忙算幾列 arr # 將二維變一維 arr.reshape(30) # 索引使用方法 array([[ 0, 1, 2, 3, 4, 5], [ 6, 7, 8, 9, 10, 11], [12, 13, 14, 15, 16, 17], [18, 19, 20, 21, 22, 23], [24, 25, 26, 27, 28, 29]]) 如今有這樣一組數據,需求:找到20 列表寫法:arr[3][2] 數組寫法:arr[3,2] # 中間經過逗號隔開就能夠了
arr數組 array([[ 0, 1, 2, 3, 4, 5], [ 6, 7, 8, 9, 10, 11], [12, 13, 14, 15, 16, 17], [18, 19, 20, 21, 22, 23], [24, 25, 26, 27, 28, 29]]) arr[1:4,1:4] # 切片方式 執行結果: array([[ 7, 8, 9], [13, 14, 15], [19, 20, 21]])
切片不會拷貝,直接使用的原視圖,若是硬要拷貝,須要在後面加.copy()方法
最後會發現修改切片後的數據影響的依然是原數據。有的人可能對一點機制有一些不理解的地方,像Python中內置的都有賦值的機制,而Numpy去沒有,實際上是由於NumPy的設計目的是處理大數據,因此你能夠想象一下,假如NumPy堅持要將數據複製來複制去的話會產生何等的性能和內存問題。
如今有這樣一個需求:給一個數組,選出數組種全部大於5的數。
li = [random.randint(1,10) for _ in range(30)] a = np.array(li) a[a>5] 執行結果: array([10, 7, 7, 9, 7, 9, 10, 9, 6, 8, 7, 6]) ---------------------------------------------- 原理: a>5會對a中的每個元素進行判斷,返回一個布爾數組 a > 5的運行結果: array([False, True, False, True, True, False, True, False, False, False, False, False, False, False, False, True, False, True, False, False, True, True, True, True, True, False, False, False, False, True]) ---------------------------------------------- 布爾型索引:將一樣大小的布爾數組傳進索引,會返回一個有True對應位置的元素的數組
能對數組中全部元素同時進行運算的函數就是通用函數
常見通用函數:
可以接受一個數組的叫作一元函數,接受兩個數組的叫二元函數,結果返回的也是一個數組
函數 | 功能 |
---|---|
abs、fabs | 分別是計算整數和浮點數的絕對值 |
sqrt | 計算各元素的平方根 |
square | 計算各元素的平方 |
exp | 計算各元素的指數e**x |
log | 計算天然對數 |
sign | 計算各元素的正負號 |
ceil | 計算各元素的ceiling值 |
floor | 計算各元素floor值,即小於等於該值的最大整數 |
rint | 計算各元素的值四捨五入到最接近的整數,保留dtype |
modf | 將數組的小數部分和整數部分以兩個獨立數組的形式返回,與Python的divmod方法相似 |
isnan | 計算各元素的正負號 |
isinf | 表示那些元素是無窮的布爾型數組 |
cos,sin,tan | 普通型和雙曲型三角函數 |
函數 | 功能 |
---|---|
add | 將數組中對應的元素相加 |
subtract | 從第一個數組中減去第二個數組中的元素 |
multiply | 數組元素相乘 |
divide、floor_divide | 除法或向下圓整除法(捨棄餘數) |
power | 對第一個數組中的元素A,根據第二個數組中的相應元素B計算A**B |
maximum,fmax | 計算最大值,fmax忽略NAN |
miximum,fmix | 計算最小值,fmin忽略NAN |
mod | 元素的求模計算(除法的餘數) |
補充內容:浮點數特殊值
浮點數:float
浮點數有兩個特殊值:
一、nan(Not a Number):不等於任何浮點數(nan != nan) --------------------------------------------- 二、inf(infinity):比任何浮點數都大 ---------------------------------------------
函數 | 功能 |
---|---|
sum | 求和 |
cumsum | 求前綴和 |
mean | 求平均數 |
std | 求標準差 |
var | 求方差 |
min | 求最小值 |
max | 求最大值 |
argmin | 求最小值索引 |
argmax | 求最大值索引 |
隨機數生成函數在np.random的子包當中
經常使用函數
函數 | 功能 |
---|---|
rand | 給定形狀產生隨機數組(0到1之間的數) |
randint | 給定形狀產生隨機整數 |
chocie | 給定形狀產生隨機選擇 |
shuffle | 與random.shuffle相同 |
uniform | 給定形狀產生隨機數組 |