数据分析
- Numpy+Scipy+Matplotlib+Pandas
- 基础数值算法 科学计算 数据可视化 序列高级函数
一.Numpy是什么?
- Numerical Python,数值的Python,补充了Python语言所欠缺的数值计算能力
- Numpy是其它数据分析及机器学习库的底层库
- Numpy完全标准C语言实现,运行效率充分优化
- Numpy开源免费,
二.Numpy的历史
- 1995年,Numeric,Python语言数值计算扩充
- 2001年,Scipy - Numarray,多维数组运算
- 2005年,Numeric + Numarray - Numpy
- 2006年,Numpy脱离Scipy成为独立的项目
三.Numpy的核心:多维数组
- 代码简洁:减少Python代码中的循环
- 底层实现:厚内核(c)+薄接口(Python),保证性能
代码:from __future__ import unicode_literals import datetime as dt import numpy as np n = 100000 start = dt.datetime.now() A,B = [],[] for i in range(n): A.append(i**2) B.append(i**3) c = [] for a,b in zip(A,B): c.append(a+b) print((dt.datetime.now() - start).microseconds) start = dt.datetime.now() A,B = np.arange(n)**2,np.arange(n)**3 C = A+B print((dt.datetime.now() - start).microseconds)
四.Numpy基础
- 数组对象
- 用np.ndarray类的对象表示n维数组
实际数据:数组中元素
元数据:描述数组中的元素
将实际数据与元数据分开存放,一方面提高了内存空间的使用率,另一方面减少对实际数据的访问频率,提高性能 - Numpy数组是同质数组,即所有元素的数据类型必须相同
- Numpy数组的下标从0开始,最后一个元素的下标为数组长度减1
- np.ndarray.dtype/shape/size:类型/维度/大小
- np.arange(起始值(0),终止值,步长(1)) - 等差序列
np.array(任何可被解释为Numpy数组的逻辑结构) -> 任意维度和类型的数组对象
代码:#维度 from __future__ import unicode_literals import numpy as np a = np.arange(1,3) print(a,a.shape) b = np.array([[1,2.,'3'],[4,5,6]]) print(b,b.shape) c=np.array([np.arange(1,4),np.arange(4,7),np.arange(7,10)]) print(c,c.shape) #[1 2] (2,) #[['1' '2.0' '3'] # ['4' '5' '6']] (2, 3) #[[1 2 3] # [4 5 6] # [7 8 9]] (3, 3)
from __future__ import unicode_literals import numpy as np a = np.arange(1,10) print(a,type(a[0]),a.dtype) b = a.astype(float) print(b,type(b[0]),b.dtype) c = b.astype(str) print(c,type(c[0]),c.dtype) #[1 2 3 4 5 6 7 8 9] <class 'numpy.int64'> int64 #[ 1. 2. 3. 4. 5. 6. 7. 8. 9.] <class 'numpy.float64'> float64 #['1.0' '2.0' '3.0' '4.0' '5.0' '6.0' '7.0' '8.0' '9.0'] <class 'numpy.str_'> <U32
from __future__ import unicode_literals import numpy as np a = np.array([[10,20,30],[40,50,60]]) print(a.shape,a.size,len(a)) b = a.reshape((6,)) print(b.shape,b.size,len(b)) c = b.reshape((3,2)) print(c,c.shape,c.size,len(c)) d = np.arange(1,25).reshape((2,3,4)) print(d.shape,d.size,len(d)) #(2, 3) 6 2 #(6,) 6 6 #[[10 20] # [30 40] # [50 60]] (3, 2) 6 3 #(2, 3, 4) 24 2
-
元素索引(下标)
数组对象[...,页号,行号,列号]
数组对象.shape - >(...,页数,行数,列数)
X号:[0,X数-1]
代码:
# -*- coding: utf-8 -*- from __future__ import unicode_literals import numpy as np a = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) print(a, a.shape) print(a[0]) print(a[0][0]) print(a[0][0][0]) print(a[0, 0, 0]) for i in range(a.shape[0]): for j in range(a.shape[1]): for k in range(a.shape[2]): print(a[i, j, k]) ##[[[1 2] ## [3 4]] ## [[5 6] ## [7 8]]] (2, 2, 2) #[[1 2] # [3 4]] #[1 2] #1 #1 #1 #2 #3 #4 #5 #6 #7 #8
-
Numpy内部基本数据类型
布尔型:bool_
整数型:
有符号:int8(-128~127)/int16/int32/int64
无符号:uint8(0~255)/uint16/uint32/uint64
浮点型:float16/float32/float64
复数型:complex64/complex128
字符串型:str_,每个字符用32位Unicode编码表示 -
自定义复合类型
代码:# -*- coding: utf-8 -*- from __future__ import unicode_literals import numpy as np a = np.array([('123', [4, 5, 6])], dtype='U3, 3i4') print(a[0]['f0'], a[0]['f1']) b = np.array([('123', [4, 5, 6])], dtype=[('fa', np.str_, 3), ('fb', np.int32, 3)]) print(b[0]['fa'], b[0]['fb']) c = np.array([('123', [4, 5, 6])], dtype={'names': ['fa', 'fb'], 'formats': ['U3', '3i4']}) print(c[0]['fa'], c[0]['fb'], c.itemsize) d = np.array([('123', [4, 5, 6])], dtype={'fa': ('U3', 0), 'fb': ('3i4', 16)}) print(d[0]['fa'], d[0]['fb'], d.itemsize) e = np.array([0x1234], dtype=('>u2', {'lo': ('u1', 0), 'hi': ('u1', 1)})) print('{:x}'.format(e[0])) print('{:x} {:x}'.format(e['lo'][0], e['hi'][0])) # 123 [4 5 6] # 123 [4 5 6] # 123 [4 5 6] 24 # 123 [4 5 6] 28 # 1234 # 12 34
-
类型字符码
np.bool_:?
np.int8:b
np.uint8:B
np.int8/16/32/64:i1/2/4/8
np.uint8/16/32/64:u1/2/4/8
np.float/16/32/64: f2/4/8
np.complex64/128: c8/16
np.str_: U<字符数>
np.datetime64: M8
字节序前缀,用于多字节整数和字符串:
</>/[=]分别表示小端/大端/硬件字节序。
<字节序前缀><维度><类型><字节数或字符数>
>3i4:大端字节序,3个元素的一维数组,每个元素都是整型,每个整型元素占4个字节。
<(2,3)u8:小端字节序,6个元素2行3列的二维数组,每个元素都是无符号整型,每个无符号整型元素占8个字节。
>U7: 包含7个字符的Unicode字符串,每个字符占4个字节,采用大端字节序。 -
切片
数组对象[起始位置:终止位置:步长,...]
缺省起始位置:(位置步长+)首 / (位置步长-)尾
缺省终止位置:(位置步长+)尾后 / (位置步长)首前
缺省位置步长:1
代码:
# -*- coding: utf-8 -*- from __future__ import unicode_literals import numpy as np a = np.arange(1, 10) print(a) # 1 2 3 4 5 6 7 8 9 print(a[:3]) # 1 2 3 print(a[3:6]) # 4 5 6 print(a[6:]) # 7 8 9 print(a[::-1]) # 9 8 7 6 5 4 3 2 1 print(a[:-4:-1]) # 9 8 7 print(a[-4:-7:-1]) # 6 5 4 print(a[-7::-1]) # 3 2 1 print(a[::]) # 1 2 3 4 5 6 7 8 9 print(a[:]) # 1 2 3 4 5 6 7 8 9 print(a[...]) # 1 2 3 4 5 6 7 8 9 print(a[::3]) # 1 4 7 print(a[1::3]) # 2 5 8 print(a[2::3]) # 3 6 9 b = np.arange(1, 25).reshape(2, 3, 4) print(b) print(b[:, 0, 0]) # 1 13 print(b[0]) print(b[0, :, :]) print(b[0, ...]) print(b[0, 1]) # 5 6 7 8 print(b[0, 1, ::2]) # 5 7 print(b[..., 1]) print(b[:, 1]) print(b[0, 1, 1::2]) # 6 8 print(b[0, :, -1]) # 4 8 12 print(b[0, ::-1, -1]) # 12 8 4 print(b[0, ::2, -1]) # 4 12 print(b[::-1, ::-1]) print(b[..., ::-1]) print(b[-1, 1:, 2:])
-
改变维度
视图变维 返回一个具有新维度的新数组对象 数据共享 reshape/ravel
复制变维 返回一个具有新维度的新数组对象 数据独立 flatten
就地变维 在原数组对象之上,改变其维度,不返回新数组
xxx.shape = ...
xxx.resize(...)
代码
# -*- coding: utf-8 -*- from __future__ import unicode_literals import numpy as np a = np.arange(1, 9) print(a) #[1 2 3 4 5 6 7 8] b = a.reshape(2, 4) print(b) #[[1 2 3 4] #[5 6 7 8]] c = b.reshape(2, 2, 2) print(c)# [[[1 2] # [3 4]] # [[5 6] # [7 8]]] d = c.ravel() print(d) #[1 2 3 4 5 6 7 8] e = c.flatten() print(e) #[1 2 3 4 5 6 7 8] a += 10 print(a, b, c, d, e, sep='\n') a.shape = (2, 4) print(a) a.resize(2, 2, 2) print(a) #[[[11 12] # [13 14]] # [[15 16] # [17 18]]] f = b.transpose() print('+++++++++++') print(f) #[[11 15] #[12 16] #[13 17] #[14 18]] a -= 10 print(f)
-
组合与拆分
垂直:
np.vstack((上,下)) -> 组合数据
np.concatenate((上,下)),axis=0)
axis表示轴向
二维数组:0-行,垂直,1-列,水平
三维数组:0-页,深度,1-行,垂直,2-列,水平
np.vsplit(数组,份数) -> 上,...下
np.split(数组,份数,axis=0)
水平
np.hstack((左,右)) -> 组合数组
np.concatenate((左,右),axis=1)
np.hsplit(数组,份数) ->左,...,右
np.split(数组,份数,axis=1)
深度
np.dstack((前,后)) ->组合数据
np.dsplit(数组,份数) ->前,...,后
行列(可以用一维数组做参数)
np.row_stack((上,下)) ->组合数组
np.column_stack((左,右)) ->组合数组
代码:
# -*- coding: utf-8 -*- from __future__ import unicode_literals import numpy as np a = np.arange(11, 20).reshape(3, 3) print(a)#[[11 12 13] #[14 15 16] #[17 18 19]] b = a + 10 print(b)#[[21 22 23] #[24 25 26] #[27 28 29]] c = np.vstack((a, b)) print(c) #[[11 12 13] #[14 15 16] #[17 18 19] #[21 22 23] #[24 25 26] #[27 28 29]] d = np.concatenate((a, b), axis=0) print(d) e, f = np.vsplit(c, 2) print(e, f, sep='\n')#[[11 12 13] # [14 15 16] # [17 18 19]] # [[21 22 23] # [24 25 26] # [27 28 29]] g, h = np.split(d, 2, axis=0) print(g, h, sep='\n') i = np.hstack((a, b)) print(i) # [[11 12 13 21 22 23] # [14 15 16 24 25 26] # [17 18 19 27 28 29]] j = np.concatenate((a, b), axis=1) print(j) # [[11 12 13 21 22 23] # [14 15 16 24 25 26] # [17 18 19 27 28 29]] k, l = np.hsplit(i, 2) print(k, l, sep='\n') # [[11 12 13] # [14 15 16] # [17 18 19]] # [[21 22 23] # [24 25 26] # [27 28 29]] m, n = np.split(i, 2, axis=1) print(m, n, sep='\n') o = np.dstack((a, b)) print(o) # [[[11 21] # [12 22] # [13 23]] # [[14 24] # [15 25] # [16 26]] # [[17 27] # [18 28] # [19 29]]] print('++++++') p, q = np.dsplit(o, 2) print(p.T[0].T, q.T[0].T, sep='\n') a, b = a.ravel(), b.ravel() print(a, b) #[11 12 13 14 15 16 17 18 19] [21 22 23 24 25 26 27 28 29] #r = np.vstack((a, b)) r = np.row_stack((a, b)) print(r) #[[11 12 13 14 15 16 17 18 19] #[21 22 23 24 25 26 27 28 29]] #s = np.hstack((a, b)) s = np.column_stack((a, b)) print(s) # [[11 21] # [12 22] # [13 23] # [14 24] # [15 25] # [16 26] # [17 27] # [18 28] # [19 29]]
-
ndarray类的属性
shape - 维度
dtype - 元素类型
size - 元素数量
ndim - 维数,len(shape)
itemsize - 元素字节数
nbytes - 总字节数 = size x itemsize
real - 复数数组的实部数组
imag - 复数数组的虚部数组
T - 数组对象的转置视图
flat - 扁平迭代器
数组对象.tolist() ->列表
代码:
# -*- coding: utf-8 -*- from __future__ import unicode_literals import numpy as np a = np.array([[1 + 1j, 2 + 4j, 3 + 7j], [4 + 2j, 5 + 5j, 6 + 8j], [7 + 3j, 8 + 6j, 9 + 9j]]) print(a.shape) #(3, 3) print(a.dtype) #complex128 print(a.size) #9 print(a.ndim) #2 print(a.size) #9 print(a.itemsize) #16 print(a.nbytes) #144 print(a.real, a.imag, sep='\n') # [[ 1. 2. 3.] # [ 4. 5. 6.] # [ 7. 8. 9.]] # [[ 1. 4. 7.] # [ 2. 5. 8.] # [ 3. 6. 9.]] print(a.T) print([elem for elem in a.flat]) b = a.tolist() print(b)
- 用np.ndarray类的对象表示n维数组
五.数据可视化
Matplotlib
|
|
Numpy
Matlab
- 基本绘图
mp.plot(水平坐标,垂直坐标)
代码:# -*- coding: utf-8 -*- from __future__ import unicode_literals import numpy as np import matplotlib.pyplot as mp x = np.linspace(-np.pi, np.pi, 1000) cos_y = np.cos(x) / 2 sin_y = np.sin(x) mp.plot(x, cos_y) mp.plot(x, sin_y) mp.show()
- 线型,线宽和颜色
mp.plot(
..., linestyle=线型, linewidth=线宽, color=颜色, ...)
代码:# -*- coding: utf-8 -*- from __future__ import unicode_literals import numpy as np import matplotlib.pyplot as mp x = np.linspace(-np.pi, np.pi, 1000) cos_y = np.cos(x) / 2 sin_y = np.sin(x) mp.plot(x, cos_y, linestyle='--', linewidth=1, color='red') mp.plot(x, sin_y, linestyle=':', linewidth=3, color='green') mp.show()