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
###如何创建数组
>>> 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.索引机制,切片和迭代方法

>>> 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)
>>>
Logo

更多推荐