Numpy

Numpy是python语言的一个扩充程序库,支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供了大量的数学函数库。

基本功能:

快速高效的多位数组对象ndarray

用于对数组执行元素级计算以及直接对数组执行数学运算的函数

用于读写硬盘还是那个基于数组的数据集的工具

线性代数运算,傅里叶变换,以及随机数生成

用于将C,C++,Fortran代码集成到python的工具

除了为python提供快速的数组处理能力,Numpy在数据分析方面还有另外一个主要作用,即作为在算法之间传递数据的容器

Numpy提供常用的数值数组,矩阵等函数

优点:

是基于向量化的运算

进行数值运算时Numpy数组比list效率高

>>> import numpy as np
>>> np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) #10个元素的数组,()
>>> list(np.arange(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] #10个元素的列表,[] 数组转列表      

Scipy

是一种使用Numpy来做高等数学,信号处理,优化,统计的扩展包

>>> from  scipy import linalg ##线性代数的包引入
>>> a=np.array([[1,2],[3,5]]) #定义一个二维的数组
>>> a
array([[1, 2],#第一行元素是1和2
       [3, 5]])#第二张元素是3和5
>>> linalg.det(a)#行列式的值,1*5-2*3
-1.0

 数据类型:使用astype将float类型转化为int的类型

>>> arr=np.array([1,2,4],dtype=np.float64)#指定数据类型
>>> print(arr.dtype)
float64
>>> float=arr.astype(dtype=np.int)#转化为指定的数据类型
>>> print(float.dtype)
int32

数组运算(加减乘除)

>>> a=np.array([[1,3,4,5],[2,4,5,5]])
>>> print(a*a)
[[ 1  9 16 25]
 [ 4 16 25 25]]
>>> print(a-a)
[[0 0 0 0]
 [0 0 0 0]]
>>> print(a+a)
[[ 2  6  8 10]
 [ 4  8 10 10]]
>>> print(1/a)#标量操作作用在数组的每个元素上
[[1.         0.33333333 0.25       0.2       ]
 [0.5        0.25       0.2        0.2       ]]

对更高维度的数组的访问和操作

>>> b = np.array([[[1,2,3],[3,4,5]],[[4,4,2],[3,2,3]]])
>>> b[0][1]
array([3, 4, 5])
>>> b[1]
array([[4, 4, 2],
       [3, 2, 3]])
>>> c = b[0].copy()#进行复制copy
>>> print(c)
[[1 2 3]
 [3 4 5]]
>>> print(c)
[[1 2 3]
 [3 4 5]]
>>> print(c[0])
[1 2 3]
>>> print(c[0,1])#访问方式
2
>>> print(c[0][1])
2

如果是,的话代表的是对多维数组的访问和操作,如果是:代表的是当前维度数组的同级操作

切片操作:

>>> d=np.array([1,4,543,2,2,2,4,24,2])
>>> print(d[:3])
[  1   4 543]
>>> print(d[3:5])
[2 2]
>>> print(d[5:])
[ 2  4 24  2]
>>> print(a)#对多维数组的访问和操作
[[1 3 4 5]
 [2 4 5 5]]
>>> print(a[1,1])#访问的是第二个数组,第一列的数值
4
>>> print(a[1,1:])#访问的是第二个数组,第一列之后的数值
[4 5 5]
>>> print(a[:1,1:])#访问的是第二个数组之前就是第一个数组,第一列之后的值(包括第一列)
[[3 4 5]]
>>> import numpy as np
>>> import numpy.random as np_random
>>> name_arr=np.array(['bob','joe','will','bob'])
>>> print(name_arr)
['bob' 'joe' 'will' 'bob']
>>> print(name_arr=='bob')
[ True False False  True]
>>> rnd_arr=np_random.randn(7,4)#随机7*4数组
>>> print(rnd_arr)
[[ 1.44479013  0.30643889  1.02635006 -0.06523054]
 [ 0.21681768 -0.22394964 -0.8573446  -1.34709504]
 [-1.14918202 -1.58816338  0.22967305  1.19319723]
 [ 0.17709409 -0.05995874 -0.53326976 -1.03580977]
 [-0.87692579 -0.45278675  0.3785352  -1.40043334]
 [ 0.06633862 -0.17220636 -0.02320015  1.34064211]
 [-2.06230887  0.75262294 -0.27911745  0.10554469]]

转置数组

>>> arr=np.arange(15).reshape((3,5))
>>> print(arr)
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]]
>>> print(arr.T)
[[ 0  5 10]
 [ 1  6 11]
 [ 2  7 12]
 [ 3  8 13]
 [ 4  9 14]]

numpy的ndarray花式索引

花式索引是一个numpy术语,他指的是利用整数数组进行索引

一次传入多个索引数组会有一点特别,他返回的是一个一维数组,其中的元素对应各个索引元祖

>>> a=np.array([2,5,6,75,4,4])
>>> print(a)
[ 2  5  6 75  4  4]
>>> print(a[[3,2,1]])##根据对应的索引进行查找[[]]
[75  6  5]
>>> print(a[[-2,-5,-1]])
[4 5 4]
>>> arr=np.arange(32).reshape((4,8))##二维数组
>>> print(arr)
[[ 0  1  2  3  4  5  6  7]
 [ 8  9 10 11 12 13 14 15]
 [16 17 18 19 20 21 22 23]
 [24 25 26 27 28 29 30 31]]
>>> print(arr[[0,1,2,3],[1,5,3,6]])##找到对应的索引,哪行那列
[ 1 13 19 30]
>>> print(arr[[0,1,2,3]][:,[0,4,6,2]])#前面对应的行数都有的列数
[[ 0  4  6  2]
 [ 8 12 14 10]
 [16 20 22 18]
 [24 28 30 26]]

可读性更好的写法,np.ix_

>>> print(arr[np.ix_([0,1,2,3],[2,3,1,4])])
[[ 2  3  1  4]
 [10 11  9 12]
 [18 19 17 20]
 [26 27 25 28]]

高维矩阵转换

>>> arr=np.arange(16).reshape((2,2,4))
>>> print(arr)
[[[ 0  1  2  3]
  [ 4  5  6  7]]

 [[ 8  9 10 11]
  [12 13 14 15]]]
>>> print(arr.transpose((1,0,2))##相当于是arr[x][y][z]=arr[y][x][z]
... )
[[[ 0  1  2  3]
  [ 8  9 10 11]]

 [[ 4  5  6  7]
  [12 13 14 15]]]

通过真值表选择元素

>>> import numpy as np
>>>
>>> x_arr=np.array([1.1,1.2,1.3,1.4,1.5])
>>> y_arr=np.array([2.1,2.2,2.3,2.4,2.5])
>>> cond=np.array([True,False,True,True,False])
>>> print(np.where(cond,x_arr,y_arr)
... )#where的用法,如果条件符合cond的话就选择x_arr,否则的话就选择y_arr
[1.1 2.2 1.3 1.4 2.5]
>>> result=[(x if c else y)  for  x,y,c in zip(x_arr,y_arr,cond)]
>>> print(result)##列表推导式,if cond就选择x,否则y
[1.1, 2.2, 1.3, 1.4, 2.5]

求和求平均

>>> import numpy.random as np_random
>>> a=np.random.randn(5,3)
>>> print(a)
[[-0.4793828  -1.88543369 -0.83255275]
 [-0.54435772  0.87330253  0.30212139]
 [-1.0161385  -0.12159845  0.68038966]
 [ 0.36880324  0.52197493 -0.65248151]
 [-0.48323991 -1.30866231  0.97144494]]
>>> print(a.mean())####求平均
-0.24038739670967324
>>> print(a.sum())##求和
-3.6058109506450986
>>> print(a.mean(axis=1))#对每一行进行求平均
[-1.06578975  0.2103554  -0.1524491   0.07943222 -0.27348576]
>>> print(a.sum(axis=0))##对每一列进行求和,axis可以省略
[-2.15431569 -1.92041699  0.46892174]

矩阵乘法

>>> import numpy.random as np_random
>>> from  numpy.linalg import  inv,qr
>>> x=np.array([[1.,2.,3.],[4.,5.,6.]])
>>> print(x)
[[1. 2. 3.]
 [4. 5. 6.]]
>>> y=np.array([[3.,5.],[3.,5.],[5.,6.]])
>>> print(x.dot(y))##结果是【1*3+2*3+3*6,1*5+2*5+3*6】
[[24. 33.]
 [57. 81.]]

 >>> print(np.dot(x,np.ones(3)))
 [ 6. 15.]

reshape重塑数组

>>> arr=np.arange(8)
>>> print(arr)
[0 1 2 3 4 5 6 7]
>>> print(arr.reshape((2,4))##一维数组可以转化为二维数组
... )
[[0 1 2 3]
 [4 5 6 7]]
>>> print(arr.reshape((2,4)).reshape((4,2))#支持链式操作
... )
[[0 1]
 [2 3]
 [4 5]
 [6 7]]

 

posted @ 2019-10-11 23:36  风不再来  阅读(281)  评论(0编辑  收藏  举报