numpy get started
numpy 提供了一種數組類型,高維數組, 提供了數據分析的運算基礎(業務表一般就是二維)
import numpy as np
導入numpy庫,並查看numpy版本
np.version
一、創建Array
1. 使用np.array()由python list創建
C 數組的概念 : 數據類型一致的一個連續的內存空間
python list列表 (C語言說:列表其實就是一個指針數組),列表不要求數據類型一致
numpy的數組:同樣是一個【有序】的,【相同數據類型】的集合
[1, 3.14, ‘helloworld’, student]
參數爲列表:
[1, 4, 2, 5, 3]
numpy設計初衷是用於運算的,所以對數據類型進行統一優化
注意:
- numpy默認ndarray的所有元素的類型是相同的
- 如果傳進來的列表中包含不同的類型,則統一爲同一類型,優先級:str>float>int
[1,3.14, ‘hello’]
numpy的數組
array = np.array([1])
array
array
array
nd.array
np.array
import numpy as np
names = [“tom”,“lucy”,“jack”]
array1 = np.array(names)
array1
scores = [1.2, 3.4, 5.6]
array2 = np.array(scores)
array2
age = [15,16,18]
array3 = np.array(age, dtype=np.float32)
array3
money = [[1,2,3],[4,5,6]]
np.array(money)
2. 使用np的routines函數創建
包含以下常見創建方法:
- np.ones(shape, dtype=None, order=‘C’)
shape = (m,n) m行n列 二維數組
shape = (m) m個元素的一維數組 [1,2,3]
shape = (m,) m個元素的一維數組
shape = (m, 1) m行1列 二維數組 [[1],[2],[3]]
shape = (1, n) 1行m列 二維數組 [[1,2,3]]
構造一個5行3列的二維數組
np.ones(shape=(5,3), dtype=np.int8)
構造長度爲3的一維數組
np.ones(shape=(3,))
np.ones(shape=(3))
構造一個5行1列的二維數組
np.ones(shape=(5,1))
構造1行3列的二維數組
np.ones(shape=(1,3))
- np.zeros(shape, dtype=float, order=‘C’)
np.zeros(shape=(5,6))
np.zeros(shape=(5))
np.zeros(shape=(5,3))
np.zeros(shape=(2,3,4))
- np.full(shape, fill_value, dtype=None, order=‘C’)
np.full(shape=(2,3), fill_value=6)
- np.eye(N, M=None, k=0, dtype=float)
對角線爲1其他的位置爲0
單位矩陣 l2正則項
生成一個3階單位矩陣(矩陣除法)
np.eye(N=3)
np.eye(N=5, M=4)
np.eye(N=5, k=-1)
- np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
等差數列
np.linspace(0,10,10, endpoint=False)
- np.arange([start, ]stop, [step, ]dtype=None)
np.arange(0,10,step=1)
- np.random.randint(low, high=None, size=None, dtype=‘l’)
size 同 shape
np.random.randint(0,100,size=(5,5))
- 正態分佈函數
- np.random.randn(d0, d1, …, dn) 標準正態分佈
- np.random.normal() 普通正態分佈
np.random.randn(3,5)
np.random.normal(loc=170, scale=5, size=(5,3))
- np.random.random(size=None)
生成0到1的隨機數,左閉右開
np.random.random(size=(5,5))
生成一組隨機索引
np.random.permutation(10)
二、ndarray的屬性
4個必記參數:
- ndim:維度
- shape:形狀(各維度的長度)
- size:總長度
- dtype:元素類型
arr = np.random.randint(0,100,size=(5,4,3))
arr.ndim
arr.shape
arr.size
獲取數組元素類型
arr.dtype
獲取數組類型
type(arr)
創建
屬性
如何訪問
如何計算
三、ndarray的基本操作
data = [[1,2,3],[4,5,6]]
data[0]
data[0][0]
1. 索引
一維與列表完全一致
多維時同理
arr1 = np.array([1,2,3,4,5])
arr1[0]
arr2 = np.array([[1,2,3],[4,5,6]])
arr2
列表的訪問方式
arr2[0][0]
numpy特有的
arr[m,n…] 描述的是對應維度的索引值
arr2[0,0]
arr2[1,2]
高級用法
arr1
1. 使用列表作爲索引訪問
arr1[[0,1,2,0,1,2]]
2. 使用BOOL列表作爲索引訪問, True對應的值會被返回
bool_list = [True, False, True, False, True]
arr1[bool_list]
eg.獲取數組中大於5的數
arr1[arr1 > 3]
arr3 = np.random.randint(0,10,size=(5,4,3))
arr3
arr3[2,0]
arr3[0,1,2]
賦值和訪問沒有區別,都可以使用
2. 切片
一維與列表完全一致
多維時同理
所有的切片方式都是開區間(左閉右開)
arr1[0:3]
arr2 = np.random.randint(0,100,size=(5,6))
arr2
行切片
arr2[0:2]
列切片 不論多少維,每一個維度的切片範圍都是用冒號表示,使用逗號分割,最後一個維度可以省略,但是被切片的維度之前的維度不能省
arr2[:,0:2]
arr3 = np.random.randint(0,10,size=(3,4,5))
arr3
切前兩個數組
arr3[0:2]
切割每一個二維數組的前兩列
arr3[:,:,0:2]
切割每一個二維數組的前兩行
arr3[:,0:2]
將數據反轉,例如[1,2,3]---->[3,2,1]
arr1[::-1]
arr2
arr2[::-1]
arr2[:,::-1]
兩個::進行切片
3. 變形
使用reshape函數,注意參數是一個tuple!
arr = np.random.randint(0,10,size=(20))
arr
arr.reshape((4,5))
arr.reshape(3,7)
4. 級聯
- np.concatenate()
級聯需要注意的點:
- 級聯的參數是列表:一定要加中括號或小括號
- 維度必須相同
- 形狀相符
- 【重點】級聯的方向默認是shape這個tuple的第一個值所代表的維度方向
- 可通過axis參數改變級聯的方向
arr1 = np.random.randint(0,10,size=(3,3))
arr2 = np.random.randint(10,20,size=(3,3))
display(arr1, arr2)
使用axis控制連接方向,axis指的是連接的維度
axis 注意軸 非常常見
np.concatenate((arr1, arr2), axis=1)
- np.hstack與np.vstack
水平級聯與垂直級聯,處理自己,進行維度的變更
horizontal
np.hstack((arr1, arr2))
vertical
np.vstack((arr1, arr2))
【注意】:級聯的時候
如果是橫向級聯,參與級聯的數組的行數要一致
縱向級聯,參與級聯的數組的列數要一致
如果是高維數組的級聯,級聯的維度的數據個數要一致
5. 切分
與級聯類似,三個函數完成切分工作:
- np.split
- np.vsplit
- np.hsplit
arr = np.random.randint(0,100,size=(6,6))
arr
直接指定切分的份數
part1, part2 = np.split(arr, indices_or_sections=2)
display(part1, part2)
使用axis控制切分方向
part1, part2, part3 = np.split(arr, indices_or_sections=3, axis=1)
display(part1, part2, part3)
arr2 = np.random.randint(0,100,size=(3,7))
arr2
indices_or_sections=[m,n] 表示的範圍是0:m, m:n, n:
part1, part2, part3 = np.split(arr2, indices_or_sections=[2,5], axis=1)
display(part1, part2, part3)
np.hsplit(arr2, indices_or_sections=[2,5])
6. 副本
所有賦值運算不會爲ndarray的任何元素創建副本。對賦值後的對象的操作也對原來的對象生效。
可使用copy()函數創建副本
copy_array = arr.copy()
arr
copy_array[0,0] = 1000
arr
copy_array
四、ndarray的聚合操作
arr
1. 求和np.sum
arr = np.random.randint(0,10,size=10)
arr
arr.sum()
求平均值
arr.mean()
arr.max()
arr.min()
求最大值索引
arr.argmax()
arr
arr.argmin()
標準方差
arr.std()
求方差
arr.var()
arr
注意這個語法格式
np.median(arr)
arr.median()
data = np.arange(0,11,step=1)
data
第一個參數是要求百分位數的數據
第二個參數是要求的百分位的位置
異常值檢測會使用Q1 Q3
np.percentile(data, [0.25, 0.75])
平均值 (d1 + d2 + d3 + … dn)/n
中位數
方差 (d1-mean)**2 + (d2-mean)**2 + … + (dn-mean)**2/n
標註差 sqrt(方差)
any 檢測一個BOOL數組中,是否至少存在一個True
all 檢測一個BOOL數組中,是否全爲True
bool_list = np.array([False, True, False, False])
bool_list.any()
bool_list = np.array([True, True, True, True])
bool_list.all()
a = 10
a > 10
找出一組數據中,所有大於該組數據平均值的值
arr
廣播運算, 支持一個numpy.arry和任意一個數運算
condition = arr > arr.mean()
condition
arr[condition]
查看一個數組中,是否存在至少一個大於10的數
(arr > 10).any()
2. 最大最小值:np.max/ np.min
同理
any() 有True返回True
all() 有False返回False
3. 其他聚合操作
Function Name NaN-safe Version Description
np.sum np.nansum Compute sum of elements
np.prod np.nanprod Compute product of elements
np.mean np.nanmean Compute mean of elements
np.std np.nanstd Compute standard deviation
np.var np.nanvar Compute variance
np.min np.nanmin Find minimum value
np.max np.nanmax Find maximum value
np.argmin np.nanargmin Find index of minimum value
np.argmax np.nanargmax Find index of maximum value
np.median np.nanmedian Compute median of elements
np.percentile np.nanpercentile Compute rank-based statistics of elements
np.any N/A Evaluate whether any elements are true
np.all N/A Evaluate whether all elements are true
np.power 冪運算
np.sum 和 np.nansum 的區別
nan not a number
五、ndarray的矩陣操作
1. 基本矩陣操作
- 算術運算符:
- 加減乘除
- 矩陣積np.dot()
a = np.array([[1,2],[3,4]])
b = np.array([[1,1],[2,2]])
display(a, b)
使用符號是對應位置相乘
a * b
如果希望做數學中的矩陣運算
np.dot(a, b)
2. 廣播機制
arr
3 3 3 3 3 3 3 3 3 3 3
arr = np.array([1,2,3,4,5])
data = 3
arr + data
【重要】ndarray廣播機制的兩條規則
- 規則一:爲缺失的維度補1
- 規則二:假定缺失元素用已有值填充
例1:
m = np.ones((2, 3))
a = np.arange(3)
求M+a
m = np.ones((2,3))
a = np.arange(3)
display(m, a)
m + a
m + 3
不能廣播運算的例子
m = np.ones(shape=(3,3))
n = np.array([[1,2],[3,4]])
display(m, n)
m + n
例2:
a = np.arange(3).reshape((3, 1))
b = np.arange(3)
求a+b
a = np.arange(0,3,step=1).reshape((3, 1))
b = np.arange(3)
display(a, b)
a + b
習題
a = np.ones((4, 1))
b = np.arange(4)
求a+b
六、ndarray的排序
小測驗:
使用以上所學numpy的知識,對一個ndarray對象進行冒泡排序。
def bubleSort(x):
代碼越短越好
1. 快速排序
np.sort()與ndarray.sort()都可以,但有區別:
- np.sort()不改變輸入
- ndarray.sort()本地處理,不佔用空間,但改變輸入
data = np.random.permutation(10)
data
data.sort()
data
np.sort(data)
2. 部分排序
np.partition(a,k)
有的時候我們不是對全部數據感興趣,我們可能只對最小或最大的一部分感興趣。
- 當k爲正時,我們想要得到最小的k個數
- 當k爲負時,我們想要得到最大的k個數
data = np.random.permutation(10000)
data
np.partition(data, 4)[:4]
np.partition(data,-4)[-4:]在這裏插入代碼片