ll1123

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

数据分析(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)数组属性汇总

  • shape - 维度

  • 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.视图变维(数据共享)操作的是元数据,若任意实际数据改变,所有数组跟着变,.reshape(),.ravel()

2.复制变维(数据独立):.flatten()

3.就地变维:直接改变原数组对象的维度,不返回新数组,.shape,.resize()

 

 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 包含7个字符的Unicode字符串,每个字符占4个字节,采用默认字节序。
M8[D] 包含8字节的日期类型,每个日期数据占8个字节,采用默认字节序。
3i4 大端字节序,3个元素的一维数组,每个元素都是整型,每个整型元素占4个字节。
<(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)

 

 

posted on 2019-10-31 20:54  Lennie-L  阅读(224)  评论(0编辑  收藏  举报