数据分析(Numpy基础)
1.什么是数据分析?
数据分析是指,用适当的统计分析方法,对收集来的大量数据进行分析,提取有用信息并形成结论,从而实现对数据的详细研究和概括总结的过程。
2.python做数据分析的常用库
1. numpy 基础数值算法 2. scipy 科学计算 3. matplotlib 数据可视化 4. pandas 序列高级函数
一、numpy概述
1.什么是numpy?
1. Numerical Python,数字的Python,弥补了Python语言所欠缺的数值计算能力。 2. Numpy是其它数据分析及机器学习库的底层库。 3. Numpy完全标准C语言实现,运行效率充分优化。 4. Numpy开源免费。
2.numpy发展历史
1. 1995年,Numeric,Python语言数值计算扩充。 2. 2001年,Scipy->Numarray,多维数组运算。 3. 2005年,Numeric+Numarray->Numpy。 4. 2006年,Numpy脱离Scipy成为独立的项目。
3.numpy的性能
1. 代码简洁:减少Python代码中的循环。
2. 底层实现:厚内核(C)+薄接口(Python),保证性能。
二、numpy基础
1.ndarray数组
1.Numpy中的数组是numpy.ndarray类实例化的对象,其中包括:
元数据(metadata):存储对目标数组的描述信息,如:shape、dtype、size、data等,
实际数据:完整的数组数据
将实际数据与元数据分开存放,一方面提高了内存空间的使用效率,另一方面大部分对数组的操作仅仅是对元数据的操作,从而减少对实际数据的访问频率,提高性能。
2.ndarray数组的特点:
1. Numpy数组是同质数组,即所有元素的数据类型必须相同
2. Numpy数组的下标从0开始,最后一个元素的下标为数组长度减1
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]
2.数组的4种创建方式
(1)numpy.array(任何可被解释为Numpy数组的逻辑结构)
(2)numpy.arange(起始值(0),终止值,步长(1))
(3)numpy.zeros(数组元素个数, dtype='类型')
(4)numpy.ones(数组元素个数, dtype='类型')
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]]
3.数组的属性
(1)数组属性汇总
-
-
dtype - 元素类型
-
size - 元素数量
-
ndim - 维数,len(shape)
-
itemsize - 元素字节数
-
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)]]
(2)数组变维
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)
(3)数组元素的数据类型:np.ndarray.dtype
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个字节。 |
(4)数组元素的个数:np.ndarray.size
(5)数组元素的索引(下标)
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])
4.数组的组合和拆分
垂直方向:numpy.vstack(上,下),numpy.vsplit(c,n)
水平方向:numpy.hstack(左,右),numpy.hsplit(c,n)
深度方向:numpy.dstack(前,后),numpy.dsplit(c,n)