数据分析是指,用适当的统计分析方法,对收集来的大量数据进行分析,提取有用信息并造成结论,从而实现对数据的详细研究和归纳总结的过程。
1. numpy 基础数值算法 2. scipy 科学计算 3. matplotlib 数据可视化 4. pandas 序列高级函数
1. Numerical Python,数字的Python,弥补了Python语言所欠缺的数值计算能力。 2. Numpy是其它数据分析及机器学习库的底层库。 3. Numpy彻底标准C语言实现,运行效率充分优化。 4. Numpy开源免费。
1. 1995年,Numeric,Python语言数值计算扩充。 2. 2001年,Scipy->Numarray,多维数组运算。 3. 2005年,Numeric+Numarray->Numpy。 4. 2006年,Numpy脱离Scipy成为独立的项目。
1. 代码简洁:减小Python代码中的循环。
2. 底层实现:厚内核(C)+薄接口(Python),保证性能。
1.Numpy中的数组是numpy.ndarray类实例化的对象,其中包括:python
元数据(metadata):存储对目标数组的描述信息,如:shape、dtype、size、data等,算法
实际数据:完整的数组数据数组
将实际数据与元数据分开存放,一方面提升了内存空间的使用效率,另外一方面大部分对数组的操做仅仅是对元数据的操做,从而减小对实际数据的访问频率,提升性能。机器学习
2.ndarray数组的特色:函数
1 import numpy 2 3 #numpy.ndarray类的对象表示数组 4 ary=numpy.array([1,2,3,4,5,6]) 5 print(ary,type(ary)) #[1 2 3 4 5 6] <class 'numpy.ndarray'> 6 7 #ndarray的运算规则:数组一个矩阵 8 ary=ary+10 9 print(ary) #[11 12 13 14 15 16] 10 11 ary=ary+ary #个数对应才能运算 12 print(ary)#[22 24 26 28 30 32] 13 14 ary=ary>30 #比较运算 15 print(ary) #[False False False False False True]
1 import numpy 2 3 #1.numpy.array() 4 a1=numpy.array([[1,2,3],[4,5,6]]) 5 print(a1,type(a1)) #[[1 2 3][4 5 6]] <class 'numpy.ndarray'> 6 7 #2.numpy.arange() 8 a2=numpy.arange(0,10,2) 9 print(a2,type(a2)) #[0 2 4 6 8] <class 'numpy.ndarray'> 10 11 #3.numpy.zeros() 12 a3=numpy.zeros((10,),dtype='float32') 13 print(a3,type(a3)) #[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] 14 15 #4.numpy.ones() 16 a4=numpy.ones((2,3),dtype='int32') 17 print(a4,type(a4)) #[[1 1 1][1 1 1]] 18 19 #numpy.ones_like() numpy.zeros_like() 20 #构建一个结构与a1相同的全1数组 21 print(numpy.ones_like(a1)) #[[1 1 1][1 1 1]]
性能
dtype - 元素类型学习
size - 元素数量优化
ndim - 维数,len(shape)ui
itemsize - 元素字节数spa
nbytes - 总字节数 = size x itemsize
real - 复数数组的实部数组
imag - 复数数组的虚部数组
T - 数组对象的转置视图
flat - 扁平迭代器
1 import numpy as np 2 3 a = np.array([[1 + 1j, 2 + 4j, 3 + 7j], 4 [4 + 2j, 5 + 5j, 6 + 8j], 5 [7 + 3j, 8 + 6j, 9 + 9j]]) 6 print(a.shape) # (3, 3) 一个元组表示3行3列 7 print(a.dtype) # complex128 一个字符串,表示复数类型,为每一个数据元素开辟16字节的内存空间 8 print(a.ndim) # 2 9 print(a.size) # 9 10 print(a.itemsize) # 16 每一个数据元素占用内存16字节 11 print(a.nbytes) # 144 整个数组总大小为144字节 12 print(a.real, a.imag, sep='\n') #复数的实部和虚部 13 # [[1. 2. 3.] 14 # [4. 5. 6.] 15 # [7. 8. 9.]] 16 # [[1. 4. 7.] 17 # [2. 5. 8.] 18 # [3. 6. 9.]] 19 print(a.T) #矩阵转置 20 # [[1.+1.j 4.+2.j 7.+3.j] 21 # [2.+4.j 5.+5.j 8.+6.j] 22 # [3.+7.j 6.+8.j 9.+9.j]] 23 print([elem for elem in a.flat]) #.flat多维数组转一维数组 24 # [(1+1j), (2+4j), (3+7j), (4+2j), (5+5j), (6+8j), (7+3j), (8+6j), (9+9j)] 25 b = a.tolist() #数组转列表(加,) 26 print(b) 27 # [[(1+1j), (2+4j), (3+7j)], [(4+2j), (5+5j), (6+8j)], [(7+3j), (8+6j), (9+9j)]]
1 import numpy as np 2 3 """ 4 1.共享数据变维:原数组维度不变,实际数据改变却都要跟着变 5 ndarray.reshape(),ndarray.ravel() 6 """ 7 a=np.arange(1,7) 8 print(a,a.shape) #[1 2 3 4 5 6] (6,) 9 10 b=a.reshape(2,3) 11 print(b,b.shape) #[[1 2 3] [4 5 6]] (2, 3) 12 13 #元数据独立,实际数据只一份 14 print(a.shape) #(6,) 15 b[0,1]=666 16 print(b) #[[1 666 3] [4 5 6]] 17 print(a) #[1 666 3 4 5 6] 18 19 c=a.reshape(-1,2)#-1表示自适应行数,指定2列 20 print(c,c.shape) #[[1 666] [3 4] [5 6]] (3, 2) 21 22 # d=c.reshape(6,) #多维变一维 23 d=c.ravel() #多维变一维 24 print(d,d.shape) #[1 666 3 4 5 6] (6,) 25 26 """ 27 2.复制变维:元数据和实际数据互不影响 28 ndarray.flatten(),copy.deepcopy() 29 """ 30 e = c.flatten() #多维变一维 31 print(e) #[ 1 666 3 4 5 6] 32 a += 10 33 print(a, e, sep='\n') 34 # [ 11 676 13 14 15 16] 35 # [ 1 666 3 4 5 6] 36 37 """ 38 3.就地变维:直接对改变原数组 39 ndarray.shape,ndarray.resize() 40 """ 41 print("----------------------------------------") 42 a=np.arange(1,9) 43 print(a,a.shape) #[1 2 3 4 5 6 7 8] (8,) 44 a.shape = (2, 4) 45 print(a,a.shape) #[[1 2 3 4] [5 6 7 8]] (2, 4) 46 a.resize(2, 2, 2) 47 print(a,a.shape) #[[[1 2] [3 4]] [[5 6] [7 8]]] (2, 2, 2)
1.基本类型
字符码 | 字符码简写 | |
---|---|---|
布尔型 | 'bool_ ' | ? |
整数型 | 'int8/16/32/64' | i1/i2/i4/i8 |
无符号整形 | 'uint8/16/32/64' | u1/u2/u4/u8 |
浮点型 | 'float/16/32/64' | f2/f4/f8 |
复数型 | 'complex64/128' | c8/c16 |
字符串型 | 'str_ ' | U<字符数> |
日期类型 | 'datetime64' | M8[Y] M8[M] M8[D] M8[h] M8[m] M8[s] |
2.简写字符码解读
类型 | 释义 |
---|---|
U7 | |
M8[D] | |
3i4 | |
<(2,3)u8 | 小端字节序,6个元素2行3列的二维数组,每一个元素都是无符号整型,每一个无符号整型元素占8个字节。 |
1.多维数组的切片
1 import numpy as np 2 3 a=np.arange(1,10) 4 a.resize(3,3) 5 print(a) 6 # [[1 2 3] 7 # [4 5 6] 8 # [7 8 9]] 9 10 print(a[:2, :2]) #以,做为分隔,切前两行的前两列 11 # [[1 2] 12 # [4 5]] 13 print(a[::2,::2]) #切一三行的一三列 14 # [[1 3] 15 # [7 9]]
2.数组的掩码操做
1 import numpy as np 2 3 a=np.arange(0,10) 4 # mask = [True, False,True, False,True, False,True, False,True, False] 5 # print(a[mask]) 6 7 #1.bool掩码 8 # mask=a%2==0 9 # print(mask) 10 # print(a[mask]) 11 print(a[a%2==0]) #[0 2 4 6 8] 12 #输出100之内3与7的公倍数 13 b=np.arange(1,100) 14 print(b[(b%3==0)&(b%7==0)]) #[21 42 63 84] 15 16 #2.索引掩码 17 c=np.array([10,20,30,40]) 18 mask=[0,1,2,3,3,2,1,0] 19 print(c[mask]) #[10 20 30 40 40 30 20 10] 20 #为商品排序 21 products=np.array(['Mi','Huawei','Apple','Samsang']) 22 price=np.array([2999,4999,8888,3999]) 23 indices=np.argsort(price)# 为数组排序,返回有序索引 24 # print(indices) #[0 3 1 2] 25 print(products[indices])
垂直方向:numpy.vstack(上,下),numpy.vsplit(c,n)
水平方向:numpy.hstack(左,右),numpy.hsplit(c,n)
深度方向:numpy.dstack(前,后),numpy.dsplit(c,n)