numpy:是数据结构基础,主要处理python在数据和数值计算过程中处理速度慢的问题。
功能:1、提供了一种新的数据结构, ndarray(数组)
2、丰富的多维操作
3、线性代数方面的运算
官网:http://www.numpy.org/
numpy的数据结构中只能有一种数据类型,通过(dtype=np.类型)定义数据类型。数据类型有bool, int, int8, int16, int32, int64, int128, uint8, uint16, uint32, uint64, uint128, float, float16, float32, float64, complex64/128.
数据维度的Python表示:
数据维度 | python表示 | 示例 |
一维数据 | 列表和集合类型 | 有序[3.1398, 3.1349, 3.1376] 无序{3.1398, 3.1349, 3.1376} |
二维数据 | 列表类型 | [[3.1398, 3.1349, 3.1376], [3.1498, 3.1449, 3.1476]] |
多维数据 | 列表类型 |
一、属性
np.array()生成一个ndarray数组,ndarray在程序中的别名是:array
np.array()输出成[]形式,元素由空格分隔。
1 import numpy as np
2 a = np.array([[0,1,2,3,4],[9,8,7,6,5]])
3 a
4 array([[0, 1, 2, 3, 4],
5 [9, 8, 7, 6, 5]])
6 print(a)
7 [[0 1 2 3 4]
8 [9 8 7 6 5]]
轴(axis):保存数据的维度 秩(rank):轴的数量
np.array是numpy中最基础的数据结构, 这个数据结构中的属性有:
属性 | 说明 |
shape | 指明形状 |
ndim | 维数 |
dtype | 数据类型 |
itemsize | np.array中每个元素的大小,以字节为单位 |
size | numpy的大小 |
输出list和array示例:
1 #encoding = utf-8
2 import numpy as np
3 #encoding = utf-8
4 import numpy as np
5 list1 = [[[1,2,3,4],
6 [4,5,6,7]],
7 [[7,8,9,10],
8 [10,11,12,13]],
9 [[14,15,16,17],
10 [18,19,20,21]]]
11 list2 = np.array([[[1,2,3,4],
12 [4,5,6,7]],
13 [[7,8,9,10],
14 [10,11,12,13]],
15 [[14,15,16,17],
16 [18,19,20,21]]
17 ])
18 print("输出列表:")
19 print(list1)
20 print("输出数列:")
21 print(list2)
22
23 运行结果:
24 输出列表:
25 [[[1, 2, 3, 4], [4, 5, 6, 7]], [[7, 8, 9, 10], [10, 11, 12, 13]], [[14, 15, 16, 17], [18, 19, 20, 21]]]
26 输出数列:
27 [[[ 1 2 3 4]
28 [ 4 5 6 7]]
29
30 [[ 7 8 9 10]
31 [10 11 12 13]]
32
33 [[14 15 16 17]
34 [18 19 20 21]]]
shape、ndim、dtype、itemsize、size的操作示例:
1 #encoding = utf-8
2 import numpy as np
3
4 def main():
5 list1 = [[1,3,5],[2,4,6]]
6 print(type(list1))
7 np_list1 = np.array(list1)
8 print(type(np_list1))
9 np_list1 = np.array(list1, dtype = np.float)
10 print(np_list1.shape)
11 print(np_list1.ndim)
12 print(np_list1.dtype)
13 print(np_list1.itemsize)
14 print(np_list1.size)
15
16 if __name__ == "__main__":
17 main()
18
19 #输出结果
20 <class 'list'>
21 <class 'numpy.ndarray'>
22 (2, 3)
23 2
24 float64
25 8
26 6
ndarray的元素类型:
数据类型 | 说明 |
bool | 布尔类型,True或False |
intc | 与C语言中的int类型一致,一般是int32或int64 |
intp | 用于索引的整数,与C语言中的ssize_t一致,int32或int64 |
int8 | 字节长度的整数,取值:[-128,127] |
int16 | 16位长度的整数,取值:[-32768,32767] |
int32 | 32位长度的整数,取值:[-231,231-1] |
int64 | 64位长度的整数,取值:[-263,263-1] |
uint8 | 8位无符号整数,取值:[0,255] |
uint16 | 16位无符号整数,取值:[0,65535] |
uint32 | 32位无符号整数,取值:[0,232-1] |
uint64 | 64位无符号整数,取值:[0,264-1] |
float16 | 16位半精度浮点数:1位符号位,5位指数,10位尾数 |
float32 | 32位半精度浮点数:1位符号位,8位指数,23位尾数 |
float64 | 64位半精度浮点数:1位符号位,11位指数,52位尾数 |
complex64 | 复数类型,实部和虚部都是32位浮点数 |
complex128 | 复数类型,实部和虚部都是64位浮点数 |
python语法仅支持整数、浮点数和复数3中类型,而ndarray支持表中那么多元素类型,原因是:
1、科学计算涉及数据较多,对存储和性能都有较高要求。
2、对元素类型精细定义,有助于Numpy合理使用存储空间并优化性能。
3、对元素类型精细定义,有助于程序员对程序规模有合理评估。
二、一些常用的数组
ndarray数组的创建方法:
(1)从python中的列表、元组等类型创建ndarray数组
x = np.array(list/tuple)
x = np.array(list/tuple,dtype=np.float32)
当np.array()不指定dtype时,NumPy将根据数据情况关联一个dtype类型。
(2)使用NumPy中函数创建ndarray数组,如:arange,ones,zeros等
数组 | 说明 |
zeros([m,n]) | 数值初始化,生成m行n列的数组 |
ones([m,n]) | 元素都置为1,生成m行n列的数组 |
full(shape,val) | 根据shape生成一个数组,每个元素值都是val |
random.rand(m,n) | 生成0-1之间服从均匀分布的随机数 |
random.rand() | 生成0-1之间的1个随机数 |
random.randint(1,10,3) | 生成3个1-10之间的随机整数,生成整数括号内不能为空 |
random.randn(m,n) | 生成服从标准正态分布的m行n列的随机数 |
random.choice([10,20,30]) | 生成10,20,30之间的1个随机数 |
random.beta(m,n,M) | 生成从m-n之间服从ß分布的M个随机数 |
zeros、ones、random.rand、random.randint、random.randn、random.choice、random.betac操作示例:
1 #encoding = utf-8
2 import numpy as np
3
4 def main():
5 print("初始化:")
6 print(np.zeros([2,4]))
7 print(np.ones([3,5]))
8
9 print("随机数:")
10 print(np.random.rand(2,4))
11 print(np.random.rand())
12
13 print("随机整数:")
14 print(np.random.randint(1,10,3))
15
16 print("正态分布的随机整数:")
17 print(np.random.randn(2,4))
18
19 print("一维数组中选择生成随机数:")
20 print(np.random.choice([10,20,30]))
21
22 print("服从beta分布的随机数:")
23 print(np.random.beta(1,10,5))
24 if __name__ == "__main__":
25 main()
26
#运行结果
27 初始化:
28 [[ 0. 0. 0. 0.]
29 [ 0. 0. 0. 0.]]
30 [[ 1. 1. 1. 1. 1.]
31 [ 1. 1. 1. 1. 1.]
32 [ 1. 1. 1. 1. 1.]]
33 随机数:
34 [[ 0.32200808 0.12104838 0.70322247 0.56456672]
35 [ 0.95257224 0.87371518 0.29743618 0.13854885]]
36 0.37279692507129536
37 随机整数:
38 [7 6 5]
39 正态分布的随机整数:
40 [[ 0.9579207 -0.66080296 -0.12798636 0.20788484]
41 [ 0.19459448 1.06547597 -0.46216803 0.90047683]]
42 一维数组中选择生成随机数:
43 30
44 服从beta分布的随机数:
45 [0.16530894 0.12363116 0.09875519 0.03737488 0.203352]
(3)使用NumPy中其他函数创建ndarray数组
函数 | 说明 |
np.linspace() | 根据起始数据等间距地填充数据,形成数组 |
np.concatenate() | 根据两个或多个数组合并成一个新的数组 |
1 import numpy as np
2 a = np.linspace(1,10,4)
3 print(a)
4 b = np.linspace(1,10,4,endpoint=False)
5 print(b)
6
7 运行结果:
8 [ 1. 4. 7. 10.]
9 [ 1. 3.25 5.5 7.75]
ndarray数组的维度变换:
方法 | 说明 |
reshape(shape) | 不改变数组元素,返回一个shape形状的数组,原数组不变 |
resize(shape) | 与reshape功能一致,但修改原数组 |
swapaxes(ax1,ax2) | 将数组n个维度中的两个维度进行调换 |
flatten() | 对数组进行降维,返回折叠后的一维数组,原数组不变 |
#reshape操作
1 import numpy as np
2 a = np.ones((2,3,4),dtype=np.int32)
3 print(a)
4 a.reshape(3,8)
5
6 运行结果:
7 [[[1 1 1 1]
8 [1 1 1 1]
9 [1 1 1 1]]
10
11 [[1 1 1 1]
12 [1 1 1 1]
13 [1 1 1 1]]]
14 Out[20]:
15 array([[1, 1, 1, 1, 1, 1, 1, 1],
16 [1, 1, 1, 1, 1, 1, 1, 1],
17 [1, 1, 1, 1, 1, 1, 1, 1]])
#swapaxes操作
1 import numpy as np
2 a = np.array([[1,2,3],[6,5,4]],dtype=np.int32)
3 print(a)
4 a.swapaxes(0,1)
5
6 运行结果:
7 [[1 2 3]
8 [6 5 4]]
9 Out[28]:
10 array([[1, 6],
11 [2, 5],
12 [3, 4]])
ndarray数组的类型变换:
new_a = a.astype(np.float)
astype()方法一定会创建新的数组(原始数据的一个拷贝),即使两个类型一致。
ndarray数组向列表的转换:
a.tolist()
三、numpy中的操作
操作 | 说明 | 备注 |
arange(m,n) | 生成m到n-1的等差数列 | 对numpy进行操作 |
exp(list) | 对列表进行指数操作 | 对numpy进行操作 |
exp2(list) | 自然指数的平方 | 对numpy进行操作 |
sqrt(list) | 开方 | 对numpy进行操作 |
log(list) | 底数是自然底数 | 对numpy进行操作 |
sum(axis=0) | 数组是n维,axis可以到n-1。在python中list相加表示追加, numpy中相加会作用到每个作用树上。axis越大深入程度越大。 | 对数组进行操作 |
max() | | 对数组进行操作 |
min() | | 对数组进行操作 |
list1+list2 | | |
list1-list2 | | |
list1*list2 | | |
list**2 | | |
np.dot(list1,list2) | | 对numpy进行操作 |
concatenate(list1, list2) | numpy中的array进行追加 | 对numpy进行操作 |
vstack((list1,list2)) | numpy中的array进行上下追加 | 对numpy进行操作 |
hstack((list1,list2)) | | 对numpy进行操作 |
split(list,2) | list分成2份 | 对numpy进行操作 |
copy(list) | 对数组进行拷贝 | 对numpy进行操作 |
对数组进行求arange、exp、exp2、sin、log操作:
1 #encoding = utf-8
2 import numpy as np
3 #Array operation
4
5 print("arithmetic progression:")
6 print(np.arange(1,11).reshape([2,-1]))#-1表示缺省
7 list1 = np.arange(1,11).reshape([2,-1])
8 print("e^(list1):")
9 print(np.exp(list1))
10 print("(list1)^2:")
11 print(np.exp2(list1))
12 print("sin")
13 print(np.sin(list1))
14 print("log")
15 print(np.log(list1))
16
17 运行结果:
18 arithmetic progression:
19 [[ 1 2 3 4 5]
20 [ 6 7 8 9 10]]
21 e^(list1):
22 [[ 2.71828183e+00 7.38905610e+00 2.00855369e+01 5.45981500e+01
23 1.48413159e+02]
24 [ 4.03428793e+02 1.09663316e+03 2.98095799e+03 8.10308393e+03
25 2.20264658e+04]]
26 (list1)^2:
27 [[ 2. 4. 8. 16. 32.]
28 [ 64. 128. 256. 512. 1024.]]
29 sin
30 [[ 0.84147098 0.90929743 0.14112001 -0.7568025 -0.95892427]
31 [-0.2794155 0.6569866 0.98935825 0.41211849 -0.54402111]]
32 log
33 [[ 0. 0.69314718 1.09861229 1.38629436 1.60943791]
34 [ 1.79175947 1.94591015 2.07944154 2.19722458 2.30258509]]
sum操作:
1 #encoding = utf-8
2 import numpy as np
3 list2 = np.array([[[1,2,3,4],
4 [4,5,6,7]],
5 [[7,8,9,10],
6 [10,11,12,13]],
7 [[14,15,16,17],
8 [18,19,20,21]]
9 ])
10 print("所有元素相加:")
11 print(list2.sum())#这里不是对numpy进行操作,直接对list进行操作
12 print("第一层相加:")
13 print(list2.sum(axis = 0))
14 print("第二层相加:")
15 print(list2.sum(axis = 1))
16 print("第三层相加:")
17 print(list2.sum(axis = 2))
18
19 运行结果:
20 所有元素相加:
21 252
22 第一层相加:
23 [[22 25 28 31]
24 [32 35 38 41]]
25 第二层相加:
26 [[ 5 7 9 11]
27 [17 19 21 23]
28 [32 34 36 38]]
29 第三层相加:
30 [[10 22]
31 [34 46]
32 [62 78]]
数列相加:
1 #encoding = utf-8
2 import numpy as np
3 list1 = np.array([10,20,30,40])
4 list2 = np.array([4,3,2,1])
5 print("Add:")
6 print(list1+list2)
7
8 运行结果:
9 Add:
10 [14 23 32 41]
数列点乘:
1 #encoding = utf-8
2 import numpy as np
3 list1 = np.array([10,20,30,40])
4 list2 = np.array([4,3,2,1])
5 print("Dot:")
6 print(np.dot(list1.reshape([2,2]), list2.reshape([2,2])))
7
8 运行结果:
9 Dot
10 [[ 80 50]
11 [200 130]]
concatenate、vstack、hstack、split、copy操作:
1 #encoding = utf-8
2 import numpy as np
3 list1 = np.array([10,20,30,40])
4 list2 = np.array([4,3,2,1])
5 print("Concatenate:")
6 print(np.concatenate((list1,list2)))
7 print("Vstack:")
8 print(np.vstack((list1,list2)))
9 print("Hstack:")
10 print(np.hstack((list1,list2)))
11 print("Split:")
12 print(np.split(list1,2))
13 print("Copy:")
14 print(np.copy(list1,2))
15
16 运行结果:
17 Concatenate:
18 [10 20 30 40 4 3 2 1]
19 Vstack:
20 [[10 20 30 40]
21 [ 4 3 2 1]]
22 Hstack:
23 [10 20 30 40 4 3 2 1]
24 Split:
25 [array([10, 20]), array([30, 40])]
26 Copy:
27 [10 20 30 40]
数组的索引和切片:
索引:获取数组中特定位置元素的过程。
切片:获取数组元素子集的过程。
多维数组的索引与切片:
1 import numpy as np
2 a = np.arange(24).reshape(2,3,4)
3 print(a)
4 print("输出索引值1:")
5 print(a[1,2,3])
6 print("输出索引值2:")
7 print(a[-1,-2,-3])
8 print("输出切片1:")
9 print(a[:,1,-3])#选取一个维度用:
10 print("输出切片2:")
11 print(a[:,1:3,:])#每个维度切片方法与一维数组相同
12 print("输出切片3:")
13 print(a[:,:,::2])#每个维度可以使用步长跳跃切片
14
15 运行结果:
16 [[[ 0 1 2 3]
17 [ 4 5 6 7]
18 [ 8 9 10 11]]
19
20 [[12 13 14 15]
21 [16 17 18 19]
22 [20 21 22 23]]]
23 #输出索引值1:
24 23
25 输出索引值2:
26 17
27 输出切片1:
28 [ 5 17]
29 输出切片2:
30 [[[ 4 5 6 7]
31 [ 8 9 10 11]]
32
33 [[16 17 18 19]
34 [20 21 22 23]]]
35 输出切片3:
36 [[[ 0 2]
37 [ 4 6]
38 [ 8 10]]
39
40 [[12 14]
41 [16 18]
42 [20 22]]]
matplotlib:丰富的可视化套件,利用它可以做出折线图、柱状图等各种图表以及复杂的三维图。
pandas:基础数据分析套件,交叉分析,时序分析,假设检验等等。