1.简介
Numpy库是进行数据分析的基础库,panda库就是基于Numpy库的,在计算多维数组与大型数组方面使用最广,还提供多个函数操作起来效率也高
2.Numpy库的安装
linux(Ubuntu和debian)下:sudo apt-get install python-numpy
linux(fedora)下:sudo yum install numpy scipy
conda isntall numpy
3.ndarray,numpy的核心
1 array方法下的几个属性
2 >>> a=np.array([1,2,3])
3 >>> a
4 array([1, 2, 3])
5 >>> type(a)
6 <class 'numpy.ndarray'>
7 >>> a.dtype
8 dtype('int32')
9 >>> a.ndim
10 1
11 >>> a.size
12 3
13 >>> a.shape
14 (3,)
15 >>> a.itemsize
16 4
3,如何创建数组
1 >>> c=np.array([[1,2,3],[4,5,6]]) 列表为参数
2 >>> c
3 array([[1, 2, 3],
4 [4, 5, 6]])
5 >>> c=np.array(((1,2,3),(4,5,6))) 元组也可以作为参数
6 >>> c
7 array([[1, 2, 3],
8 [4, 5, 6]])
在创建数组的时候也可以指定类型,常用 都有int-,int8,int16,int32,int64,float_,float16,32,64,uint8,16,32,64
1 >>> c=np.array([[1,2,3],[4,5,6]],dtype=complex)
2 >>> c
3 array([[ 1.+0.j, 2.+0.j, 3.+0.j],
4 [ 4.+0.j, 5.+0.j, 6.+0.j]])
5 >>> c.dtype
6 dtype('complex128')
7 >>> c.dtype.name
8 'complex128'
自带的数组创建方法
>>> np.zeros((3,3))
array([[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]])
>>> np.ones((3,3))
array([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
>>> np.arange(0,10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.arange(0,12,3)
array([0, 3, 6, 9])
>>> np.arange(0,4,0.6)
array([ 0. , 0.6, 1.2, 1.8, 2.4, 3. , 3.6])
>>> np.arange(0,12).reshape(3,4)
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> np.linspace(0,10,5)
array([ 0. , 2.5, 5. , 7.5, 10. ])
>>> np.random.random(6)
array([ 0.90252601, 0.85271104, 0.17201238, 0.9884257 , 0.74112411,
0.28453949])
>>> np.random.random((3,3))
array([[ 0.98041444, 0.40374122, 0.1174572 ],
[ 0.8121098 , 0.24770467, 0.9823125 ],
[ 0.22909469, 0.96560959, 0.47319287]])
4.说完了数组的创建方法,下面讲下数组的计算方法
1 >>> a=np.arange(4)
2 >>> a
3 array([0, 1, 2, 3])
算术运算符
4 >>> a+4
5 array([4, 5, 6, 7])
6 >>> a*2
7 array([0, 2, 4, 6])
8 >>> a
9 array([0, 1, 2, 3])
10 >>> a*a
11 array([0, 1, 4, 9])
12 >>> b=np.arange(4,8)
13 >>> b
14 array([4, 5, 6, 7])
15 >>> a*np.sin(b)
16 array([-0. , -0.95892427, -0.558831 , 1.9709598 ])
17 >>> a*np.sqrt(b)
18 array([ 0. , 2.23606798, 4.89897949, 7.93725393])
矩阵相乘
19 >>> A=np.arange(9).reshape(3,3)
20 >>> A
21 array([[0, 1, 2],
22 [3, 4, 5],
23 [6, 7, 8]])
24 >>> B=np.ones((3,3))
25 >>> B
26 array([[ 1., 1., 1.],
27 [ 1., 1., 1.],
28 [ 1., 1., 1.]])
29 >>> A*B
30 array([[ 0., 1., 2.],
31 [ 3., 4., 5.],
32 [ 6., 7., 8.]])
33 >>> np.dot(A,B)
34 array([[ 3., 3., 3.],
35 [ 12., 12., 12.],
36 [ 21., 21., 21.]])
37 >>> A
38 array([[0, 1, 2],
39 [3, 4, 5],
40 [6, 7, 8]])
41 >>> a
42 array([0, 1, 2, 3])
自增自减运算符
43 >>> a+=4
44 >>> a
45 array([4, 5, 6, 7])
46 >>> a*=2
47 >>> a
48 array([ 8, 10, 12, 14])
通用函数
49 >>> np.sin(a)
50 array([ 0.98935825, -0.54402111, -0.53657292, 0.99060736])
51 >>> np.sqrt(a)
52 array([ 2.82842712, 3.16227766, 3.46410162, 3.74165739])
53 >>> np.log(a)
54 array([ 2.07944154, 2.30258509, 2.48490665, 2.63905733])
聚合函数
55 >>> a.sum()
56 44
57 >>> a.min()
58 8
59
60 >>> a.max()
61 14
62 >>> a.mean()
63 11.0
64 >>> a.std()
65 2.2360679774997898
66 >>>
5.索引机制,切片和迭代方法
1)索引机制
1 >>> np.arange(9)
2 array([0, 1, 2, 3, 4, 5, 6, 7, 8]) 一维数组根据索引取数
3 >>> a=np.arange(9)
4 >>> a[2]
5 2
6 >>> a[[2,3,4]]
7 array([2, 3, 4])
8 >>> A=np.arange(10,19).reshape((3,3))
9 >>> A
10 array([[10, 11, 12], 矩阵根据索引取数
11 [13, 14, 15],
12 [16, 17, 18]])
13 >>> A[1,2]
14 15
15 >>> A[[1,2],[2,2]]
16 array([15, 18])
2)切片操作(所谓切片,就是用冒号隔开的数字置于方括号里)
1 >>> a=np.arange(10,16) 一维数组的切片操作
2 >>> a
3 array([10, 11, 12, 13, 14, 15])
4 >>> a[1:5]
5 array([11, 12, 13, 14])
6 >>> a[1:5:2]
7 array([11, 13])
8 >>> a[::2]
9 array([10, 12, 14])
10 >>> a[:5:2]
11 array([10, 12, 14])
12 >>> a[:5:]
13 array([10, 11, 12, 13, 14])
二维数组矩阵的切片
1 >>> A=np.arange(10,19).reshape((3,3))
2 >>> A[0,:]
3 array([10, 11, 12])
4 >>> A
5 array([[10, 11, 12],
6 [13, 14, 15],
7 [16, 17, 18]])
8 >>> A[:,0]
9 array([10, 13, 16])
10 >>> A[0:2,0:2] 行列的切片
11 array([[10, 11],
12 [13, 14]])
13 >>> A[[0,2],0:2] 行,或列的不连续切片
14 array([[10, 11],
15 [16, 17]])
6数组的遍历方法
1 >>> for i in a:
2 print(i)
3
4
5 10
6 11
7 12
8 13
9 14
10 15
11 >>> for row in A:
12 print(row)
13
14
15 [10 11 12]
16 [13 14 15]
17 [16 17 18]
18 >>> for item in A.flat:
19 print(item)
20
21
22 10
23 11
24 12
25 13
26 14
27 15
28 16
29 17
30 18
31 >>> np.apply_along_axis(np.mean,axis=0,arr=A) 更优雅的迭代方法,应用自定义函数
32 array([ 13., 14., 15.])
33 >>> np.apply_along_axis(np.mean,axis=1,arr=A)
34 array([ 11., 14., 17.])
35 >>> def foo(x):
36 return x/2
37
38 >>> np.apply_along_axis(foo,axis=1,arr=A)
39 array([[ 5. , 5.5, 6. ],
40 [ 6.5, 7. , 7.5],
41 [ 8. , 8.5, 9. ]])
7.对数组的的元素应用条件,返回boolean值
1 >>> A=np.random.random((4,4))
2 >>> A
3 array([[ 0.70709738, 0.80240902, 0.94803025, 0.98312311],
4 [ 0.07900716, 0.93118649, 0.75250378, 0.35555096],
5 [ 0.66154306, 0.96191193, 0.15286704, 0.44050484],
6 [ 0.87358818, 0.23117656, 0.59518599, 0.58695854]])
7 >>> A<0.5
8 array([[False, False, False, False],
9 [ True, False, False, True],
10 [False, False, True, True],
11 [False, True, False, False]], dtype=bool)
12 >>> A[A<0.5]
13 array([ 0.07900716, 0.35555096, 0.15286704, 0.44050484, 0.23117656])
8.我们可以通过reape()方法来改变以为数组的形状,也可以通过修改shape这个属性字段来修改
>>> a
array([ 0.70290611, 0.79908059, 0.67798575, 0.67487014, 0.77510071,
0.87493472, 0.25405607, 0.38421272, 0.05605654, 0.14063901,
0.11186545, 0.76120191])
>>> a.shape=(3,4)
>>> a
array([[ 0.70290611, 0.79908059, 0.67798575, 0.67487014],
[ 0.77510071, 0.87493472, 0.25405607, 0.38421272],
[ 0.05605654, 0.14063901, 0.11186545, 0.76120191]])
>>> a.shape
(3, 4)
>>> a=a.ravel()
>>> a
array([ 0.70290611, 0.79908059, 0.67798575, 0.67487014, 0.77510071,
0.87493472, 0.25405607, 0.38421272, 0.05605654, 0.14063901,
0.11186545, 0.76120191])
>>> a.shape=(12)
>>> a
array([ 0.70290611, 0.79908059, 0.67798575, 0.67487014, 0.77510071,
0.87493472, 0.25405607, 0.38421272, 0.05605654, 0.14063901,
0.11186545, 0.76120191])
>>> A
array([[ 0.70709738, 0.80240902, 0.94803025, 0.98312311],
[ 0.07900716, 0.93118649, 0.75250378, 0.35555096],
[ 0.66154306, 0.96191193, 0.15286704, 0.44050484],
[ 0.87358818, 0.23117656, 0.59518599, 0.58695854]])
>>> A.transpose() 矩阵的转置函数
array([[ 0.70709738, 0.07900716, 0.66154306, 0.87358818],
[ 0.80240902, 0.93118649, 0.96191193, 0.23117656],
[ 0.94803025, 0.75250378, 0.15286704, 0.59518599],
[ 0.98312311, 0.35555096, 0.44050484, 0.58695854]])
>>>
9.数组的连接,1)上下对接2)左右对接 原理是运用了栈这个概念,一个是水平栈,一个是垂直栈,有两种方法,一个是vstack,hstack,另一个是column_stack,row_stack
1 >>> A=np.zeros((3,3))
2 >>> B=np.ones((3,3))
3 >>> np.vstack((A,B))
4 array([[ 0., 0., 0.],
5 [ 0., 0., 0.],
6 [ 0., 0., 0.],
7 [ 1., 1., 1.],
8 [ 1., 1., 1.],
9 [ 1., 1., 1.]])
10 >>> np.hstack((A,B))
11 array([[ 0., 0., 0., 1., 1., 1.],
12 [ 0., 0., 0., 1., 1., 1.],
13 [ 0., 0., 0., 1., 1., 1.]])
14 >>> np.column_stack((A,B))
15 array([[ 0., 0., 0., 1., 1., 1.],
16 [ 0., 0., 0., 1., 1., 1.],
17 [ 0., 0., 0., 1., 1., 1.]])
18 >>> np.row_stack ((A,B))
19 array([[ 0., 0., 0.],
20 [ 0., 0., 0.],
21 [ 0., 0., 0.],
22 [ 1., 1., 1.],
23 [ 1., 1., 1.],
24 [ 1., 1., 1.]])
9.数组的切分,数组切分其实是数组连接的逆操作
两种方法:1)hsplist(),vsplist() 2)split() 此方法更强大,能指定参数分割成不对称的两个部分
1 >>> A=np.arange(16).reshape((4,4))
2 >>> A
3 array([[ 0, 1, 2, 3],
4 [ 4, 5, 6, 7],
5 [ 8, 9, 10, 11],
6 [12, 13, 14, 15]])
7 >>> [B,C]=np.hsplit(A,2)
8 >>> B
9 array([[ 0, 1],
10 [ 4, 5],
11 [ 8, 9],
12 [12, 13]])
13 >>> C
14 array([[ 2, 3],
15 [ 6, 7],
16 [10, 11],
17 [14, 15]])
18 >>> [B,C]=np.vsplit(A,2)
19 >>> B
20 array([[0, 1, 2, 3],
21 [4, 5, 6, 7]])
22 >>> C
23 array([[ 8, 9, 10, 11],
24 [12, 13, 14, 15]])
25 >>> [A1,A2,A3]=np.split(A,[1,3],axis=1) split函数指定从1,3开始分割,1代表列,0代表行
26 >>> A1
27 array([[ 0],
28 [ 4],
29 [ 8],
30 [12]])
31 >>> A2
32 array([[ 1, 2],
33 [ 5, 6],
34 [ 9, 10],
35 [13, 14]])
36 >>> A3
37 array([[ 3],
38 [ 7],
39 [11],
40 [15]])
41 >>> [A1,A2,A3]=np.split(A,[1,3],axis=0)
42 >>> A1
43 array([[0, 1, 2, 3]])
44 >>> A2
45 array([[ 4, 5, 6, 7],
46 [ 8, 9, 10, 11]])
47 >>> A3
48 array([[12, 13, 14, 15]])
10.对象的副本与视图,在numpy库中我们队数组的操作并不会在原来的数组上创建副本,而是得到原来数组的视图,当我们改变原来的数组时,新的数组也会随之发生改变,包括切片也是 ,需要区别的是,Python列表操作得到的是副本,如果想要得到numpy中数组的副本,用copy函数
1 >>> a=np.arange(4)
2 >>> a
3 array([0, 1, 2, 3])
4 >>> b=a
5 >>> b
6 array([0, 1, 2, 3])
7 >>> a[0]=1
8 >>> b[0]
9 1
10 >>> c=a.copy() 用copy()来得到副本
11 >>> a
12 array([1, 1, 2, 3])
13 >>> c
14 array([1, 1, 2, 3])
15 >>> a[0]=0
16 >>> c
17 array([1, 1, 2, 3])
18 >>> a
19 array([0, 1, 2, 3])
10.numpy数组的 广播机制(broadcasting)
当两个数组形状不相同时,我们可以用广播机制进行运算,广播机制会自动将数组进行补全
补全规则:1)应用广播机制也是有条件的,需要两个数组在以为条件下等长,如不是,则会抛出异常
2)为缺失的维度补上一个1,如下,将b变成4*1
3)为缺失元素用已有值进行填充,将b变成4个【0,1,2,3】
1 >>> A
2 array([[ 0, 1, 2, 3],
3 [ 4, 5, 6, 7],
4 [ 8, 9, 10, 11],
5 [12, 13, 14, 15]])
6 >>> b=np.arange(4)
7 >>> A+b
8 array([[ 0, 2, 4, 6],
9 [ 4, 6, 8, 10],
10 [ 8, 10, 12, 14],
11 [12, 14, 16, 18]])
12 >>>
11。结构化数组
除了一维数组,二维数组,还可以创建更复杂的结构体数组,其中每个元素都是一个结构体,下面阐述下结构体的类型
1 >>> structued=np.array([(1,'first',0.5,1+2j),(2,'second',1.3,2-2j),(3,'third',8.3,4-2j)],dtype=('i2,a6,f4,c8'))
2 >>> structued
3 array([(1, b'first', 0.5 , 1.+2.j),
4 (2, b'second', 1.29999995, 2.-2.j),
5 (3, b'third', 8.30000019, 4.-2.j)],
6 dtype=[('f0', '<i2'), ('f1', 'S6'), ('f2', '<f4'), ('f3', '<c8')]) 对每一列指定元素的名字与类型,相当于关键字
7 >>> structued[1]
8 (2, b'second', 1.29999995, 2.-2.j)
9 >>> structued[2]
10 (3, b'third', 8.30000019, 4.-2.j)
11 >>> structued['f0']
12 array([1, 2, 3], dtype=int16)
13 >>> structued['f1']
14 array([b'first', b'second', b'third'],
15 dtype='|S6')
16 >>> structued=np.array([(1,'first',0.5,1+2j),(2,'second',1.3,2-2j),(3,'third',8.3,4-2j)],dtype=[('id','<i2'),('position','a6'),('value','f4'),('complex','c8')])
17 >>> structued
18 array([(1, b'first', 0.5 , 1.+2.j),
19 (2, b'second', 1.29999995, 2.-2.j),
20 (3, b'third', 8.30000019, 4.-2.j)],
21 dtype=[('id', '<i2'), ('position', 'S6'), ('value', '<f4'), ('complex', '<c8')])
22 >>> structued.dtype.names
23 ('id', 'position', 'value', 'complex')
24
25 >>> structued['position'] 通过一个关键字来获取所有结构体元素的值
26 array([b'first', b'second', b'third'],
27 dtype='|S6')
12.numpy文件的数据读与写
两种方式1)二进制文件的读与写 2)从文件中读取数据text,csv
1 >>> np.save('c:A',A) 保存到文件中
2 >>> load_data=np.load('c:A.npy') 从文件中读取 ,np模块保存的是二进制数据
3 >>> load_data
4 array([[ 0, 1, 2, 3],
5 [ 4, 5, 6, 7],
6 [ 8, 9, 10, 11],
7 [12, 13, 14, 15]])
>>> data=np.genfromtxt('c:333.csv',delimiter=',',names=True) genfromtxt()这个方法只能读取数字,对于字符串类型的则便成为NAN
>>> data
array([( 0., nan, 12., nan), ( 1., nan, 24., nan),
( 2., nan, 25., nan)],
dtype=[('A', '<f8'), ('add', '<f8'), ('age', '<f8'), ('name', '<f8')])
>>> data['A']
array([ 0., 1., 2.])
>>> data[0]
( 0., nan, 12., nan)
>>>