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的核心
array方法下的几个属性
>>> a=np.array([1,2,3])
>>> a
array([1, 2, 3])
>>> type(a)
<class 'numpy.ndarray'>
>>> a.dtype
dtype('int32')
>>> a.ndim
1
>>> a.size
3
>>> a.shape
(3,)
>>> a.itemsize
4
3,如何创建数组
>>> c=np.array([[1,2,3],[4,5,6]]) 列表为参数
>>> c
array([[1, 2, 3],
[4, 5, 6]])
>>> c=np.array(((1,2,3),(4,5,6))) 元组也可以作为参数
>>> c
array([[1, 2, 3],
[4, 5, 6]])
在创建数组的时候也可以指定类型,常用 都有int-,int8,int16,int32,int64,float_,float16,32,64,uint8,16,32,64
>>> c=np.array([[1,2,3],[4,5,6]],dtype=complex)
>>> c
array([[ 1.+0.j, 2.+0.j, 3.+0.j],
[ 4.+0.j, 5.+0.j, 6.+0.j]])
>>> c.dtype
dtype('complex128')
>>> c.dtype.name
'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.说完了数组的创建方法,下面讲下数组的计算方法
>>> a=np.arange(4)
>>> a
array([0, 1, 2, 3])
算术运算符
>>> a+4
array([4, 5, 6, 7])
>>> a*2
array([0, 2, 4, 6])
>>> a
array([0, 1, 2, 3])
>>> a*a
array([0, 1, 4, 9])
>>> b=np.arange(4,8)
>>> b
array([4, 5, 6, 7])
>>> a*np.sin(b)
array([-0. , -0.95892427, -0.558831 , 1.9709598 ])
>>> a*np.sqrt(b)
array([ 0. , 2.23606798, 4.89897949, 7.93725393])
矩阵相乘
>>> A=np.arange(9).reshape(3,3)
>>> A
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
>>> B=np.ones((3,3))
>>> B
array([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
>>> A*B
array([[ 0., 1., 2.],
[ 3., 4., 5.],
[ 6., 7., 8.]])
>>> np.dot(A,B)
array([[ 3., 3., 3.],
[ 12., 12., 12.],
[ 21., 21., 21.]])
>>> A
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
>>> a
array([0, 1, 2, 3])
自增自减运算符
>>> a+=4
>>> a
array([4, 5, 6, 7])
>>> a*=2
>>> a
array([ 8, 10, 12, 14])
通用函数
>>> np.sin(a)
array([ 0.98935825, -0.54402111, -0.53657292, 0.99060736])
>>> np.sqrt(a)
array([ 2.82842712, 3.16227766, 3.46410162, 3.74165739])
>>> np.log(a)
array([ 2.07944154, 2.30258509, 2.48490665, 2.63905733])
聚合函数
>>> a.sum()
44
>>> a.min()
8 >>> a.max()
14
>>> a.mean()
11.0
>>> a.std()
2.2360679774997898
>>>
5.索引机制,切片和迭代方法
1)索引机制
>>> np.arange(9)
array([0, 1, 2, 3, 4, 5, 6, 7, 8]) 一维数组根据索引取数
>>> a=np.arange(9)
>>> a[2]
2
>>> a[[2,3,4]]
array([2, 3, 4])
>>> A=np.arange(10,19).reshape((3,3))
>>> A
array([[10, 11, 12], 矩阵根据索引取数
[13, 14, 15],
[16, 17, 18]])
>>> A[1,2]
15
>>> A[[1,2],[2,2]]
array([15, 18])
2)切片操作(所谓切片,就是用冒号隔开的数字置于方括号里)
>>> a=np.arange(10,16) 一维数组的切片操作
>>> a
array([10, 11, 12, 13, 14, 15])
>>> a[1:5]
array([11, 12, 13, 14])
>>> a[1:5:2]
array([11, 13])
>>> a[::2]
array([10, 12, 14])
>>> a[:5:2]
array([10, 12, 14])
>>> a[:5:]
array([10, 11, 12, 13, 14])
二维数组矩阵的切片
>>> A=np.arange(10,19).reshape((3,3))
>>> A[0,:]
array([10, 11, 12])
>>> A
array([[10, 11, 12],
[13, 14, 15],
[16, 17, 18]])
>>> A[:,0]
array([10, 13, 16])
>>> A[0:2,0:2] 行列的切片
array([[10, 11],
[13, 14]])
>>> A[[0,2],0:2] 行,或列的不连续切片
array([[10, 11],
[16, 17]])
6数组的遍历方法
>>> for i in a:
print(i) 10
11
12
13
14
15
>>> for row in A:
print(row) [10 11 12]
[13 14 15]
[16 17 18]
>>> for item in A.flat:
print(item) 10
11
12
13
14
15
16
17
18
>>> np.apply_along_axis(np.mean,axis=0,arr=A) 更优雅的迭代方法,应用自定义函数
array([ 13., 14., 15.])
>>> np.apply_along_axis(np.mean,axis=1,arr=A)
array([ 11., 14., 17.])
>>> def foo(x):
return x/2 >>> np.apply_along_axis(foo,axis=1,arr=A)
array([[ 5. , 5.5, 6. ],
[ 6.5, 7. , 7.5],
[ 8. , 8.5, 9. ]])
7.对数组的的元素应用条件,返回boolean值
>>> A=np.random.random((4,4))
>>> 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<0.5
array([[False, False, False, False],
[ True, False, False, True],
[False, False, True, True],
[False, True, False, False]], dtype=bool)
>>> A[A<0.5]
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
>>> A=np.zeros((3,3))
>>> B=np.ones((3,3))
>>> np.vstack((A,B))
array([[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
>>> np.hstack((A,B))
array([[ 0., 0., 0., 1., 1., 1.],
[ 0., 0., 0., 1., 1., 1.],
[ 0., 0., 0., 1., 1., 1.]])
>>> np.column_stack((A,B))
array([[ 0., 0., 0., 1., 1., 1.],
[ 0., 0., 0., 1., 1., 1.],
[ 0., 0., 0., 1., 1., 1.]])
>>> np.row_stack ((A,B))
array([[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
9.数组的切分,数组切分其实是数组连接的逆操作
两种方法:1)hsplist(),vsplist() 2)split() 此方法更强大,能指定参数分割成不对称的两个部分
>>> A=np.arange(16).reshape((4,4))
>>> A
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
>>> [B,C]=np.hsplit(A,2)
>>> B
array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13]])
>>> C
array([[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15]])
>>> [B,C]=np.vsplit(A,2)
>>> B
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
>>> C
array([[ 8, 9, 10, 11],
[12, 13, 14, 15]])
>>> [A1,A2,A3]=np.split(A,[1,3],axis=1) split函数指定从1,3开始分割,1代表列,0代表行
>>> A1
array([[ 0],
[ 4],
[ 8],
[12]])
>>> A2
array([[ 1, 2],
[ 5, 6],
[ 9, 10],
[13, 14]])
>>> A3
array([[ 3],
[ 7],
[11],
[15]])
>>> [A1,A2,A3]=np.split(A,[1,3],axis=0)
>>> A1
array([[0, 1, 2, 3]])
>>> A2
array([[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> A3
array([[12, 13, 14, 15]])
10.对象的副本与视图,在numpy库中我们队数组的操作并不会在原来的数组上创建副本,而是得到原来数组的视图,当我们改变原来的数组时,新的数组也会随之发生改变,包括切片也是 ,需要区别的是,Python列表操作得到的是副本,如果想要得到numpy中数组的副本,用copy函数
>>> a=np.arange(4)
>>> a
array([0, 1, 2, 3])
>>> b=a
>>> b
array([0, 1, 2, 3])
>>> a[0]=1
>>> b[0]
1
>>> c=a.copy() 用copy()来得到副本
>>> a
array([1, 1, 2, 3])
>>> c
array([1, 1, 2, 3])
>>> a[0]=0
>>> c
array([1, 1, 2, 3])
>>> a
array([0, 1, 2, 3])
10.numpy数组的 广播机制(broadcasting)
当两个数组形状不相同时,我们可以用广播机制进行运算,广播机制会自动将数组进行补全
补全规则:1)应用广播机制也是有条件的,需要两个数组在以为条件下等长,如不是,则会抛出异常
2)为缺失的维度补上一个1,如下,将b变成4*1
3)为缺失元素用已有值进行填充,将b变成4个【0,1,2,3】
>>> A
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
>>> b=np.arange(4)
>>> A+b
array([[ 0, 2, 4, 6],
[ 4, 6, 8, 10],
[ 8, 10, 12, 14],
[12, 14, 16, 18]])
>>>
11。结构化数组
除了一维数组,二维数组,还可以创建更复杂的结构体数组,其中每个元素都是一个结构体,下面阐述下结构体的类型
>>> 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'))
>>> structued
array([(1, b'first', 0.5 , 1.+2.j),
(2, b'second', 1.29999995, 2.-2.j),
(3, b'third', 8.30000019, 4.-2.j)],
dtype=[('f0', '<i2'), ('f1', 'S6'), ('f2', '<f4'), ('f3', '<c8')]) 对每一列指定元素的名字与类型,相当于关键字
>>> structued[1]
(2, b'second', 1.29999995, 2.-2.j)
>>> structued[2]
(3, b'third', 8.30000019, 4.-2.j)
>>> structued['f0']
array([1, 2, 3], dtype=int16)
>>> structued['f1']
array([b'first', b'second', b'third'],
dtype='|S6')
>>> 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')])
>>> structued
array([(1, b'first', 0.5 , 1.+2.j),
(2, b'second', 1.29999995, 2.-2.j),
(3, b'third', 8.30000019, 4.-2.j)],
dtype=[('id', '<i2'), ('position', 'S6'), ('value', '<f4'), ('complex', '<c8')])
>>> structued.dtype.names
('id', 'position', 'value', 'complex') >>> structued['position'] 通过一个关键字来获取所有结构体元素的值
array([b'first', b'second', b'third'],
dtype='|S6')
12.numpy文件的数据读与写
两种方式1)二进制文件的读与写 2)从文件中读取数据text,csv
>>> np.save('c:A',A) 保存到文件中
>>> load_data=np.load('c:A.npy') 从文件中读取 ,np模块保存的是二进制数据
>>> load_data
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[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)
>>>