一.Anaconda
1.1 安裝Anaconda
#Ubuntu 安裝 Anaconda3 詳細步驟
參考:https://blog.csdn.net/u012318074/article/details/77074665
1.2 修改下載源鏡像
#添加“清華鏡像”渠道
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/
conda config --set show_channel_urls yes
二.為什么使用python進行數(shù)據(jù)分析
1.python大量的庫為數(shù)據(jù)分析和處理提供了完整的工具集
2.比起R和Matlab等其他主要用于數(shù)據(jù)分析的編程語言榜贴,Python更全能
Python不僅提供數(shù)據(jù)處理平臺绳军,而且還有其他語言和專業(yè)應用所沒有的應用争舞。
可以用作腳本
可以操作數(shù)據(jù)庫
可以開發(fā)web應用
3.Python庫一直在增加县恕,算法的實現(xiàn)采用更具創(chuàng)新性的方法
4.Python能和很多語言對接讶坯,例如高效的C語言
三.什么是Ipython
ipython是一個性能強大的python終端
1.ipython shell:功能強大的交互式shell
$ ipython
2.ipython notebook:集文本、代碼、圖像、公式的展現(xiàn)于一體的超級python web界面
從ipython4.0開始改名成Jupyter notebook
四.什么是Jupyter
Jupyter notebook:集文本、代碼锹漱、圖像箭养、公式的展現(xiàn)于一體的超級python web界面
五.Ipython
5.1 啟動:
ipython notebook/jupyter notebook
5.2 Ipython幫助文檔
1.Help(參數(shù))方法:help(len)
2.
?
??可以顯示源碼
例如:
chr?
/////////////////////////////////////////////////////////////
L=[1,2,3]
L?
/////////////////////////////////////////////////////////////
def myFunc(i):
"""
help test
"""
return i
myFunc(10)
myFun??
3.tab自動補全
5.3 Ipython魔法指令
1.運行外部Python文件:%run a.py(當前路徑)
運行其他路徑:%run /home/nanfengpo/Desktop/bb.py
尤其要注意的是,當我們使用魔法命令執(zhí)行了一個外部文件時
該文件的函數(shù)就能在當前會話中使用
2.運行計時
用下面命令計算statement的運行時間:
%time statement
用下面命令計算statement的平均運行時間:
%timeit statement
可以使用兩個百分號來測試多行代碼的平均運行時間:
%%timeit
statement1
statement2
statement3
%time一般用于耗時長的代碼段
%timeit一般用于耗時短的代碼段
3.查看當前會話中的所有變量與函數(shù)
快速查看當前會話的所有變量與函數(shù)名稱:
%who
查看當前會話的所有變量與函數(shù)名稱的詳細信息:
%whos
返回一個字符串列表哥牍,里面元素是當前會話的所有變量與函數(shù)名稱:
%who_ls
4.執(zhí)行Linux指令使用毕泌!
在Linux指令之前加上感嘆號,即可在ipython當中執(zhí)行Linux指令嗅辣。
注意會將標準輸出以字符串形式返回
5.4 Jupyter notebook快捷鍵
? Enter : 轉(zhuǎn)入編輯模式
? Shift-Enter : 運行本單元撼泛,選中下個單元
? Y : 單元轉(zhuǎn)入代碼狀態(tài)
? M :單元轉(zhuǎn)入markdown狀態(tài)
? A : 在上方插入新單元
? B : 在下方插入新單元
? Double-D:刪除一行
? Ctrl-A : 全選
? Ctrl-Z : 復原
? Shift-Enter : 運行本單元,選中下一單元
? Ctrl-Enter : 運行本單元
? Alt-Enter : 運行本單元澡谭,在下面插入一單元
六.Numpy
6.1 什么是Numpy:Numeric Python
NumPy系統(tǒng)是Python的一種開源的數(shù)值計算擴展
一個強大的N維數(shù)組對象Array
比較成熟的(廣播)函數(shù)庫
用于整合C/C++和Fortran代碼的工具包
實用的線性代數(shù)愿题、傅里葉變換和隨機數(shù)生成函數(shù)
numpy和稀疏矩陣運算包scipy配合使用更加強大
6.2 導入
import numpy as np
查看版本
np.__version__
6.3 創(chuàng)建ndarray
6.3.1 使用np.array()
#一維
import numpy as np
test = np.array([1,2,3,4,5])
test
////////////////////////////////
#多維
test = np.array([[1,2,3],[4,5,6]])
test
6.3.2 使用np的routines函數(shù)創(chuàng)建
1) np.ones(shape, dtype=None, order='C')
np.ones([3,3])
輸出結(jié)果:
array([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
np.ones([3,3],dtype=int)
輸出結(jié)果:
array([[1, 1, 1],
[1, 1, 1],
[1, 1, 1]])
2) np.zeros(shape, dtype=float, order='C')
n3 = np.zeros((4,5))
n3
輸出結(jié)果:
array([[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.]])
3) np.full(shape, fill_value, dtype=None, order='C')
np.full([3,3],3.14)
輸出結(jié)果:
array([[ 3.14, 3.14, 3.14],
[ 3.14, 3.14, 3.14],
[ 3.14, 3.14, 3.14]])
4) np.eye(N, M=None, k=0, dtype=float)
np.eye(4)
輸出結(jié)果:
array([[ 1., 0., 0., 0.],
[ 0., 1., 0., 0.],
[ 0., 0., 1., 0.],
[ 0., 0., 0., 1.]])
np.eye(4,4蛙奖,1)
輸出結(jié)果:
array([[ 0., 1., 0., 0.],
[ 0., 0., 1., 0.],
[ 0., 0., 0., 1.],
[ 0., 0., 0., 0.]])
np.eye(4潘酗,4,-1)
輸出結(jié)果:
array([[ 0., 0., 0., 0.],
[ 1., 0., 0., 0.],
[ 0., 1., 0., 0.],
[ 0., 0., 1., 0.]])
5) np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
等差數(shù)列
np.linspace(0,10,5)
輸出結(jié)果:
array([ 0. , 2.5, 5. , 7.5, 10. ])
6) np.arange([start, ]stop, [step, ]dtype=None)
等差數(shù)列
np.arange(0,10,2)
輸出結(jié)果:
array([0, 2, 4, 6, 8])
7) np.random.randint(low, high=None, size=None, dtype='l')
np.random.randint(0,10,5)
輸出結(jié)果:
array([0, 7, 2, 3, 7])
8) np.random.randn(d0, d1, ..., dn)
np.random.randn(10)
# 每次都不一樣
輸出結(jié)果:
array([-1.74976547, 0.3426804 , 1.1530358 , -0.25243604, 0.98132079,
0.51421884, 0.22117967, -1.07004333, -0.18949583, 0.25500144])
//////////////////////////////////////////////////
np.random.seed(100)#隨機的種子雁仲,有了種子仔夺,每次都一樣
np.random.randn(10)
輸出結(jié)果:
array([ 0.37332715, -0.2887605 , 0.04985088, -0.93815832, -0.4087037 ,
1.13352254, 0.52713526, -0.76014192, -0.97292788, 0.16290446])
9) np.random.random(size=None)
np.random.random(100)
# 每次每次都不一樣
輸出結(jié)果:
array([ 0.01150584, 0.52951883, 0.07689008, 0.72856545, 0.26700953,
0.38506149, 0.56252666, 0.59974406, 0.38050248, 0.14719008,
0.6360734 , 0.27812695, 0.73241298, 0.10904588, 0.57071762,
0.56808218, 0.33192772, 0.61444518, 0.07289501, 0.86464595,
0.71140253, 0.3221285 , 0.92556313, 0.26511829, 0.8487166 ,
0.38634413, 0.32169243, 0.80473196, 0.92050868, 0.17325157,
0.63503329, 0.89463233, 0.02796505, 0.04396453, 0.20603116,
0.77663591, 0.96595455, 0.77823865, 0.90867045, 0.39274922,
0.89526325, 0.26002297, 0.38606984, 0.69176715, 0.3170825 ,
0.86994578, 0.35648567, 0.19945661, 0.16109699, 0.58245076,
0.20239367, 0.7099113 , 0.41444565, 0.16725785, 0.01170234,
0.79989105, 0.76490449, 0.25418521, 0.55082581, 0.29550998,
0.02919009, 0.32737646, 0.29171893, 0.67664205, 0.24447834,
0.49631976, 0.41136961, 0.82478264, 0.76439988, 0.78829201,
0.24360075, 0.26151563, 0.51388418, 0.19823452, 0.44097815,
0.53198973, 0.50187154, 0.72374522, 0.11090765, 0.63469357,
0.69199977, 0.97093079, 0.35920669, 0.86493051, 0.01984456,
0.32219702, 0.58608421, 0.26591245, 0.51851213, 0.7896492 ,
0.04914308, 0.28711285, 0.36225247, 0.21299697, 0.99046025,
0.11375325, 0.70964612, 0.06599185, 0.47323442, 0.62003386])
//////////////////////////////////////////////////////////////////////////////////////////////////
np.random.random([3,3])
輸出結(jié)果:
array([[ 0.37590691, 0.15563239, 0.7754904 ],
[ 0.40353019, 0.59708594, 0.57000741],
[ 0.33286511, 0.15678606, 0.58814922]])
10) np.random.normal(loc=0.0, scale=1.0, size=None)
n = np.random.normal(175, scale=5.0, size=50)
n
輸出結(jié)果:
array([177.62703208, 176.50746247, 173.26956915, 162.29355083,
172.05271936, 177.61948035, 172.52243162, 175.43294252,
181.14225673, 175.21450574, 179.56055092, 170.883815 ,
170.91435313, 176.25008762, 176.3347509 , 183.90347049,
178.91856559, 168.84725605, 176.32881783, 172.77973728,
173.12257339, 174.75054378, 166.60349541, 171.68263799,
168.83419713, 174.25085091, 175.66113435, 174.12039025,
177.22772738, 169.01523024, 175.57587527, 172.89083838,
179.52153939, 173.70318334, 179.06473552, 176.50099117,
175.83008746, 174.78059027, 175.58909128, 178.11274357,
183.45771692, 172.43399789, 179.56800892, 182.14239994,
176.43701867, 177.37866513, 179.55215095, 174.5389049 ,
175.48698667, 168.73145269])
6.3.3 ndarray的屬性
ndim:維度
shape:形狀(各維度的長度)
size:總長度
dtype:元素類型
6.3.4 ndarray的基本操作
1) 索引
一維與列表完全一致 多維時同理
np.random.seed(1)
x = np.random.randint(10,size=[3,4,5])
print(x[2,0,0])
print(x)
5
[[[5 8 9 5 0]
[0 1 7 6 9]
[2 4 5 2 4]
[2 4 7 7 9]]
[[1 7 0 6 9]
[9 7 6 9 1]
[0 1 8 8 3]
[9 8 7 3 6]]
[[5 1 9 3 4]
[8 1 4 0 3]
[9 2 0 4 9]
[2 7 7 9 8]]]
2) 切片
一維與列表完全一致 多維時同理
np.random.seed(0)
x = np.random.randint(100,size = (10,4))
x
輸出結(jié)果:
array([[44, 47, 64, 67],
[67, 9, 83, 21],
[36, 87, 70, 88],
[88, 12, 58, 65],
[39, 87, 46, 88],
[81, 37, 25, 77],
[72, 9, 20, 80],
[69, 79, 47, 64],
[82, 99, 88, 49],
[29, 19, 19, 14]])
切片:
x[7:10]
切片結(jié)果:
array([[69, 79, 47, 64],
[82, 99, 88, 49],
[29, 19, 19, 14]])
3) 變形
使用reshape函數(shù),注意參數(shù)是一個tuple攒砖!
x = np.arange(0,16).reshape(4,4)
x
執(zhí)行結(jié)果:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
類型是:
type(x.shape)
tuple
4) 級聯(lián)
1.np.concatenate() 級聯(lián)需要注意的點:
級聯(lián)的參數(shù)是列表:一定要加中括號
維度必須相同
形狀相符
【重點】級聯(lián)的方向默認是shape這個tuple的第一個值所代表的維度方向
可通過axis參數(shù)改變級聯(lián)的方向
x = np.array([1,2,3])
y = np.array([1,5,6,7,3,20])
x
輸出 array([1, 2, 3])
輸出 array([ 1, 5, 6, 7, 3, 20])
z = np.concatenate([x,y])
z
輸出 array([ 1, 2, 3, 1, 5, 6, 7, 3, 20])
z.shape
輸出 (9,)
/////////////////////////////////////////////////////
#二維
x = np.array([[1,2,3],[4,5,6]])
x
array([[1, 2, 3],
[4, 5, 6]])
x.shape
(2,3)
p = np.concatenate([x,x]).shape
p
(4, 3)
2.axis
import numpy as np
x = np.array([[[1,2,3],[2,2,3],[3,3,3]],[[4,4,4],[5,5,5],[6,6,6]]])
print(x)
print(x.shape)
輸出:
[[[1 2 3]
[2 2 3]
[3 3 3]]
[[4 4 4]
[5 5 5]
[6 6 6]]]
(2, 3, 3)
////////////////////////////////
w = np.concatenate([x,x],axis = 0)
print(w.shape)
print(w)
輸出:
(4, 3, 3)
[[[1 2 3]
[2 2 3]
[3 3 3]]
[[4 4 4]
[5 5 5]
[6 6 6]]
[[1 2 3]
[2 2 3]
[3 3 3]]
[[4 4 4]
[5 5 5]
[6 6 6]]]
////////////////////////////////////
w = np.concatenate([x,x],axis = 1)
print(w.shape)
print(w)
輸出:
(2, 6, 3)
[[[1 2 3]
[2 2 3]
[3 3 3]
[1 2 3]
[2 2 3]
[3 3 3]]
[[4 4 4]
[5 5 5]
[6 6 6]
[4 4 4]
[5 5 5]
[6 6 6]]]
/////////////////////////////////////
w = np.concatenate([x,x],axis = 2)
print(w.shape)
print(w)
輸出:
(2, 3, 6)
[[[1 2 3 1 2 3]
[2 2 3 2 2 3]
[3 3 3 3 3 3]]
[[4 4 4 4 4 4]
[5 5 5 5 5 5]
[6 6 6 6 6 6]]]
3.np.hstack與np.vstack 水平級聯(lián)與垂直級聯(lián)
x = np.array([[1,1],[2,2],[3,3]])
y = np.array([1,2,3])
print(np.hstack(x))
print(np.vstack(y))
輸出:
[1 1 2 2 3 3]
[[1]
[2]
[3]]
5) 切分
1.np.split()
x = np.arange(1,10)
x
輸出:
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
x1,x2,x3 = np.split(x,[3,5])
print(x1,x2,x3)
輸出:
[1 2 3] [4 5] [6 7 8 9]
2.np.hsplit()
x = np.arange(16).reshape(4,4)
x
輸出:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
print(np.hsplit(x,[2,3]))
輸出:
[array([[ 0, 1],[ 4, 5], [ 8, 9], [12, 13]]),
array([[ 2], [ 6], [10], [14]]),
array([[ 3], [ 7], [11], [15]])]
3.np.vsplit()
x = np.arange(16).reshape(4,4)
x
輸出:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
print(np.vsplit(x,[2,3]))
輸出:
[array([[0, 1, 2, 3],
[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]]), array([[12, 13, 14, 15]])]
6) 副本
1.所有賦值運算不會為ndarray的任何元素創(chuàng)建副本缸兔。
對賦值后的對象的操作也對原來的對象生效
a = np.array([1,2,3])
b=a
print(a,b)
輸出:
[1 2 3] [1 2 3]
b[0]=2
a
輸出:
array([2, 2, 3])
2.可使用copy()函數(shù)創(chuàng)建副本
a = np.array([1,2,3])
b = a.copy()
b
輸出:
[1,2,3]
b[0]=3
print(a,b)
輸出:
[1 2 3] [3 2 3]
6)ndarray的聚合操作
1.求和np.sum
import numpy as np
np.random.seed(0)
a = np.random.randint(1000,size = 100)
print(np.sum(a))
b = np.random.randint(1000,size = (3,4,5))
print(np.sum(b))
輸出:
52397
32865
計算求和時間
%timeit np.sum(a)
輸出:
2.63 μs ± 34.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
l = [1,2,3]
np.sum(l)
輸出:
2.最大最小值:np.max/ np.min
%time max(a)
%time np.max(a)
print(max(a))
print(np.max(a))
print(min(a))
print(np.min(a))
輸出:
CPU times: user 0 ns, sys: 0 ns, total: 0 ns
Wall time: 22.4 μs
CPU times: user 0 ns, sys: 0 ns, total: 0 ns
Wall time: 61.3 μs
999
999
9
9
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
////////////////////////////////////////////////////
a = np.array([1,2,3,4,np.nan])
print(np.sum(a))
print(np.nansum(a))
輸出:
nan
10.0
4.操作文件
import pandas as pd
data = pd.read_csv('../../data/president_heights.csv')
heights = np.array(data['height(cm)'])
heights
輸出:
array([189, 170, 189, 163, 183, 171, 185, 168, 173, 183, 173, 173, 175,
178, 183, 193, 178, 173, 174, 183, 183, 168, 170, 178, 182, 180,
183, 178, 182, 188, 175, 179, 183, 193, 182, 183, 177, 185, 188,
188, 182, 185])
1.求平均值
np.mean(heights)
2.求最大值
np.max(heights)
3.求最小值
np.min(heights)
4.計算標準差
heights.std()
7)ndarray的矩陣操作
1.基本矩陣操作
算術運算符:
加減乘除
a = np.array([[1,2,3],
[4,5,6]])
a
輸出:
array([[1, 2, 3],
[4, 5, 6]])
a+1
輸出:
array([[2, 3, 4],
[5, 6, 7]])
a*2
輸出:
array([[ 2, 4, 6],
[ 8, 10, 12]])
a+[[1,4,9],[3,3,3]]
輸出:
array([[ 2, 6, 12],
[ 7, 8, 9]])
a*2-2
輸出:
array([[ 0, 2, 4],
[ 6, 8, 10]])
矩陣積
a = np.array([[1,2,3],
[4,5,6]])
a
輸出:
array([[1, 2, 3],
[4, 5, 6]])
b = np.array([[1,1],
[1,1],
[1,1]])
b
輸出:
array([[1, 1],
[1, 1],
[1, 1]])
np.dot(a,b)
輸出:
array([[ 6, 6],
[15, 15]])
2.廣播機制
【重要】ndarray廣播機制的兩條規(guī)則
規(guī)則一:為缺失的維度補1
規(guī)則二:假定缺失元素用已有值填充
例1: m = np.ones((2, 3)) a = np.arange(3) 求m+a
m = np.ones((2,3))
m
輸出:
array([[ 1., 1., 1.],
[ 1., 1., 1.]])
a = np.arange(3)
a
輸出:
array([0, 1, 2])
m+a
輸出:
array([[ 1., 2., 3.],
[ 1., 2., 3.]])
例2: a = np.arange(3).reshape((3, 1)) b = np.arange(3) 求a+b
a = np.arange(3).reshape((3,1))
a
輸出:
array([[0],
[1],
[2]])
b = np.arange(3)
b
輸出:
array([0, 1, 2])
a+b
輸出:
array([[0, 1, 2],
[1, 2, 3],
[2, 3, 4]])
8)ndarray的排序
1.冒泡排序
a = [3,1,5,2,4]
for i in range(len(a)-1):
for j in range(i, len(a)):
if a[i]>a[j]:
a[i],a[j]=a[j],a[i]
a
輸出:
[1, 2, 3, 5, 4]
使用以上所學numpy的知識,對一個ndarray對象進行選擇排序
import numpy as np
a = np.array([33,2,67,9,88,22,34])
def selectSort(x):
for i in range(len(x)):
swap = np.argmin(x[i:])+i
[x[i],x[swap]] = [x[swap],x[i]]
selectSort(a)
a
輸出:
array([ 2, 9, 22, 33, 34, 67, 88])
2.快速排序
np.sort()與ndarray.sort()都可以吹艇,但有區(qū)別:
np.sort()不改變輸入
ndarray.sort()本地處理惰蜜,不占用空間,但改變輸入
np.sort()不改變輸入
np.random.seed(10)
a = np.random.randint(0,100,10)
b = np.random.randint(0,100,10)
print(a,b)
print(np.sort(a),a)
輸入:
[ 9 15 64 28 89 93 29 8 73 0] [40 36 16 11 54 88 62 33 72 78]
[ 0 8 9 15 28 29 64 73 89 93] [ 9 15 64 28 89 93 29 8 73 0]
ndarray.sort()本地處理受神,不占用空間蝎抽,但改變輸入
np.random.seed(20)
a = np.random.randint(0,100,10)
b = np.random.randint(0,100,10)
print(a,b)
print(a.sort(),a)
輸出:
[99 90 15 95 28 90 9 20 75 22] [71 34 96 40 85 90 26 83 16 62]
None [ 9 15 20 22 28 75 90 90 95 99]
3.部分排序
np.partition(a,k)
有的時候我們不是對全部數(shù)據(jù)感興趣,我們可能只對最小或最大的一部分感興趣。
當k為正時樟结,我們想要得到最小的k個數(shù)
當k為負時养交,我們想要得到最大的k個數(shù)
k為正
import numpy as np
a = np.random.randint(0,100,10)
print(a)
print(np.partition(a,3))
輸出:
[67 0 63 42 30 82 28 63 95 13]
[ 0 13 28 30 42 82 63 63 95 67]
k為負
b = np.random.randint(0,100,10)
print(b)
print(np.partition(b,-3))
輸出:
[89 66 11 58 97 7 50 13 87 77]
[ 7 13 11 50 58 66 77 87 89 97]
4.排序算法匯總
https://www.cnblogs.com/onepixel/articles/7674659.html