提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
Numpy
python三大库numpy,pandas以及matplotlib在人工智能领域有广泛的营运。下面我将介绍一些关于Numpy的一些简单教程
一、Numpy是什么?
NumPy(Numeric Python)提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。专为进行严格的数字处理而产生。
numpy的优点在于,他的大部分代码都是用c编写的,所以它在实现起来比python的代码有了更高的性能。
二、使用步骤
1.引入库
代码如下:
import numpy as np
print(np.__version__)
正常输入就是引入成功了。
2.优点
1、代码更加简洁,numpy可以直接以数组、矩阵为颗粒计算,不需要python for循环进行底层实现
2、性能高效:numpy是又c编写的,这也是比python高效的原因
3、人工智能为什么要学numpy: 因为使用tensorflow和paddlepaddle的时候经常会用到numpy
3.array对象
3.1 简介
1、他的元素必须是同一种元素
2、array对象可以是一维的也可是多维的
3.2 属性
- 1.shape:返回一个元组,表示他的维度(两行三列)
- 2.ndim:一个数字,表示array的维度的数目(2维)
- 3.size:表示所有数据元素的数目(共6个元素)
- 4.dtype:表示array中元素的数据类型(int型64位)
3.3 创建方法
1. 直接创建
如上图,不多赘述。下面主要讲解numpy一些特殊的创建方法。
2. arrange
创建一个默认从0开始到n(不包括)结束的的序列
arange([start,] stop[, step,], dtype=None, *, like=None)
start:开始数字索引
stop:停止数字索引(不包含)
step:步长(默认为1)
import numpy as np
a = np.arange(10)
print(a)
a1=np.arange(2,11,2)
3. ones/one_like (常用)
ones():创建一个全为1的序列
ones(shape,
dtype: None = ...,
order: Any = ...)
shape:如果是一个int数字,将生成输入数字个数的1元素;如果是一个元祖(m,n),将生成一个m行m列的数组
dtype:默认是float型
import numpy as np
a = np.ones(8)
print(a)
#[1. 1. 1. 1. 1. 1. 1. 1.]
#此为10个float的1
a1=np.ones((2,4),dtype=int)
print(a1)
#[[1 1 1 1]
# [1 1 1 1]]
# 2行4列个1
ones_like([shape]): 生成一个shape形状的全是1的数组
ones(shape, dtype: None = ...,order: Any = ...)
shape:可以是一个数组,调用后将返回该数组形状的全是1的数组
dtype:默认是float型
import numpy as np
x=np.array([[1,2,3,4],
[6,7,8,9]])
#x为2行4列的数组
a=np.ones_like(x)
print(a)
#[[1 1 1 1]
# [1 1 1 1]]
4. zeros/zeros_like
与ones/one_like相同,不多多赘述
5. empty/empty_like
创建一个全是0的数组(注意:数据没有初始化,不能随便用)
empty_like同上
a=np.empty(10)
print(a)
#[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
a1=np.empty((2,4))
print(a1)
#[[0. 0. 0. 0.]
# [0. 0. 0. 0.]]
- full/full_like
创建一个全是指定值的数组
full(shape,fill_value,[dtype],[order])
shape:如果是一个int数字,将生成输入数字个数的1元素;如果是一个元祖(m,n),将生成一个m行m列的数组
dtype:默认是int型
import numpy as np
x=np.full((2,3),5)
print(x)
# [[5 5 5]
# [5 5 5]]
a=np.full_like(x,10)
print(a)
# [[10 10 10]
# [10 10 10]]
- eye
生成一个单位矩阵(对角戏是1)
numpy.eye(N, M=None, k=0, dtype=<class 'float'>, order='C')
N:行数
M:列数,默认为N
k:对角线偏移量(默认为0,偏移相对于主对角线而言的,正数向上偏移,负数向下)
import numpy as np
x=np.eye(3)
print(x)
# [[1. 0. 0.]
# [0. 1. 0.]
# [0. 0. 1.]]
x=np.eye(3,5,1)
print(x)
# [[0. 1. 0. 0. 0.]
# [0. 0. 1. 0. 0.]
# [0. 0. 0. 1. 0.]]
3.4 其他支持函数
1. reshape(m,n)
使array变成指定形状的矩阵(注意数量关系)
如下例中,reshape(2,5)变成(1,5)则会报错
import numpy as np
x = np.arange(10)
#[0 1 2 3 4 5 6 7 8 9]
x=x.reshape(2,5)
# [[0 1 2 3 4]
# [5 6 7 8 9]]
2.转置
import numpy as np
x = np.arange(10)
#[0 1 2 3 4 5 6 7 8 9]
x=x.reshape(2,5)
# [[0 1 2 3 4]
# [5 6 7 8 9]]
x=x.transpose()
# [[0 5]
# [1 6]
# [2 7]
# [3 8]
# [4 9]]
3. 数学运算
支持sin、cos、exp等运算
import numpy as np
x = np.arange(10)
#[0 1 2 3 4 5 6 7 8 9]
x=x.reshape(2,5)
# [[0 1 2 3 4]
# [5 6 7 8 9]]
a=np.sin(x)
print(a)
# [[ 0. 0.84147098 0.90929743 0.14112001 -0.7568025 ]
# [-0.95892427 -0.2794155 0.6569866 0.98935825 0.41211849]]
a=np.exp(x)
print(a)
# [[1.00000000e+00 2.71828183e+00 7.38905610e+00 2.00855369e+01
# 5.45981500e+01]
# [1.48413159e+02 4.03428793e+02 1.09663316e+03 2.98095799e+03
# 8.10308393e+03]]
4. 矩阵的加法、减法和数乘运算
import numpy as np
x = np.arange(10)
#[0 1 2 3 4 5 6 7 8 9]
x=x.reshape(2,5)
# [[0 1 2 3 4]
# [5 6 7 8 9]]
x=x*2
print(x)
# [[ 0 2 4 6 8]
# [10 12 14 16 18]]
x1=x+1
print(x1)
# [[ 1 3 5 7 9]
# [11 13 15 17 19]]
print(x+x1)
# [[ 1 5 9 13 17]
# [21 25 29 33 37]]
print(x-x1)
# [[-1 -1 -1 -1 -1]
# [-1 -1 -1 -1 -1]]
5. 矩阵的内积
import numpy as np
x = np.arange(10)
#[0 1 2 3 4 5 6 7 8 9]
x=x.reshape(2,5)
# [[0 1 2 3 4]
# [5 6 7 8 9]]
x=x*2
print(x)
# [[ 0 2 4 6 8]
# [10 12 14 16 18]]
x1=(x+1).reshape(5,2)
print(x1)
# [[ 1 3]
# [ 5 7]
# [ 9 11]
# [13 15]
# [17 19]]
print(np.dot(x,x1))
# [[260 300]
# [710 850]]
6.矩阵的去重
import numpy as np
x = np.array([1,3,5,6,3,7,2,7])
print(np.unique(x))
# [1 2 3 5 6 7]
4.array的元素访问
一维数组与list类似,不多赘述,下面介绍多位数组的访问
4.1. 访问某一元素
两种表示:分别以传统访问多维数组的形式和以中间逗号隔开的形式进行访问
import numpy as np
x = np.arange(10)
#[0 1 2 3 4 5 6 7 8 9]
x=x.reshape(2,5)
# [[0 1 2 3 4]
# [5 6 7 8 9]]
print(x[1][0])
# 5
print(x[1,0])
# 5
4. 2. 切片
import numpy as np
x = np.arange(10)
#[0 1 2 3 4 5 6 7 8 9]
x=x.reshape(2,5)
# [[0 1 2 3 4]
# [5 6 7 8 9]]
print(x[:,1]) #访问任何行的下标为1的元素
# [1 6]
print(x[1,:2]) #访问第1行从第0个元素到第2个元素(不包含)
# [5 6]
4.3. 修改元素
注意:array的元素更改时,直接进行修改,不是传统python中那样返回修改后的值
import numpy as np
x = np.arange(10)
#[0 1 2 3 4 5 6 7 8 9]
x=x.reshape(2,5)
# [[0 1 2 3 4]
# [5 6 7 8 9]]
x[1,:3]=5 #把第1行中第0个到第3个元素(不包含)改为5
print(x)
# [[0 1 2 3 4]
# [5 5 5 8 9]]
x[:,4]=7 #把第4列的元素改为7
print(x)
# [[0 1 2 3 7]
# [5 5 5 8 7]]
4.4. 索引列表访问数组(骚操作~)
通过建立一个索引数组,来筛选原数组中的元素
一维数组:
import numpy as np
x = np.arange(10)
#[0 1 2 3 4 5 6 7 8 9]
index=[[1,2],[0,3]] #索引是一个二维数组,第一维元素为第1,2个元素,第二维是第0,3个元素
# index=np.array([[1,2],[0,3]])
print(x[index])
# [[1 2]
# [0 3]]
二维数组:
import numpy as np
x = np.arange(50)
#[0 1 2 3 4 5 6 7 8 9]
x=x.reshape(5,10)
# [[ 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 32 33 34 35 36 37 38 39]
# [40 41 42 43 44 45 46 47 48 49]]
print(x[[0,2]]) #访问第第0行到第2行(不包含)的全部元素,列的表示可以省略
# [[ 0 1 2 3 4 5 6 7 8 9]
# [20 21 22 23 24 25 26 27 28 29]]
print(x[[0,2],[1,2]]) #访问第0行第1列,第1行第2列元素
# [ 1 22]
print(x[:,[1,2]]) #访问第1列和第2列元素
# [[ 1 2]
# [11 12]
# [21 22]
# [31 32]
# [41 42]]
4.5. 布尔索引形式访问
若整个array对象进行布尔运算,会返回一个布尔数组
若是在array下标中进行布尔运算,会返回满足条件的元素
import numpy as np
x = np.arange(50)
#[0 1 2 3 4 5 6 7 8 9]
x=x.reshape(5,10)
# [[ 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 32 33 34 35 36 37 38 39]
# [40 41 42 43 44 45 46 47 48 49]]
print(x[x>25]) #返回x中大于25的元素
# [26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49]
print(x>25) #返回一个布尔数组,大于25为True
# [[False False False False False False False False False False]
# [False False False False False False False False False False]
# [False False False False False False True True True True]
# [ True True True True True True True True True True]
# [ True True True True True True True True True True]]
print(x[:,3]>25) #返回第三列中大于25的元素
# [False False False True True]
print(x[x[:,3]>25]) #把上面例子的返回值传给x,实现了按行筛选
#表示第三列元素中大于25的行有哪些
# [[30 31 32 33 34 35 36 37 38 39]
# [40 41 42 43 44 45 46 47 48 49]]
5.numpy的random函数
5.1. seed种子随机数
只要seed里面的数字一样,随机数就一样
import random
import numpy as np
random.seed(11)
print(random.random())
# 0.4523795535098186
random.seed(11)
print(random.random())
# 0.4523795535098186
5.2. np.random生成随机数
import numpy as np
x=np.random.random() #生成一个随机数
print(x)
# 0.32471618880701403
x=np.random.random(2) #生成两个随机数,以数组形式返回
print(x)
# [0.68599923 0.50451375]
x=np.random.random((2,4)) #生成一个2维的随机数
print(x)
#[[0.6246443 0.5357063 0.06110544 0.69624078]
# [0.85776077 0.23277816 0.40158491 0.26114804]]
x=np.random.random((2,4,4)) #3维的
print(x)
#[[[0.99664584 0.09490713 0.94087163 0.8785629 ]
# [0.47347512 0.30502182 0.72785404 0.7151043 ]
# [0.5438125 0.89533598 0.16967053 0.68795328]
# [0.94698029 0.77208038 0.26061892 0.40313368]]
#
# [[0.52387602 0.44286876 0.88976069 0.94550894]
# [0.79770062 0.97122511 0.19350571 0.43263063]
# [0.59020537 0.1929595 0.9544921 0.92953262]
# [0.88650613 0.87664169 0.53490072 0.43289063]]]
5.3 随机数其他常用方法
如下:
import numpy as np
print(np.random.rand()) #[0,1]之间均匀分布的随机数,括号中的内容是数组形状
# 0.8715283469661129
print(np.random.randn(2,4)) #[0,1]之间正态分布的随机数,括号中的内容是数组形状
# [[ 1.64742051 0.00550732 0.80273896 0.98577244]
# [ 1.254194 -0.46643943 1.2846487 1.00962942]]
print(np.random.randint(1,8)) #两个参数是low和high,生成low到high之间的随机数
# 7
a=np.arange(20)
print(np.random.choice(a,5)) #从a数组中随机取5个元素
# [ 2 10 19 8 5]
print(np.random.permutation(a)) #返回a的随机排列
# [11 6 19 15 0 2 1 9 14 13 5 10 3 7 12 18 4 8 16 17]
print(np.random.normal(5,1,5)) #normal[loc,scale,size],按照平均值loc,方差scale,生成size个数组
# [3.59675462 3.26264966 4.79407178 6.95609337 5.07818668]
6.常用数据统计函数
6.1 常用数学统计函数
import numpy as np
a=np.arange(10)
# [0 1 2 3 4 5 6 7 8 9]
print(np.sum(a)) #各元素求和
# 45
print(np.prod(a[1:])) #各元素乘积
# 362880
print(np.cumsum(a)) #元素逐个加和
# [ 0 1 3 6 10 15 21 28 36 45]
print(np.cumprod(a[1:])) #元素逐个加和
# [ 1 2 6 24 120 720 5040 40320 362880]
print(np.min(a),np.max(a)) #返回最大值和最小值
# 0 9
print(np.percentile(a,20)) #百分位数
# 1.8
print(np.median(a),np.average(a)) #中位数 平均数
# 4.5 4.5
print(np.std(a),np.var(a)) #标准差 方差
# 2.8722813232690143 8.25
6.2 axis参数
axis=0:代表行
axis=1:代表列
axis参数的作用:如果没有axis参数,那么将按照一维数组的标准进行计算;加了axis之后,会按行或按列生成结果。
注意:以上函数大部分均可加入axis参数
a=np.reshape(a,(2,5))
# [[0 1 2 3 4]
# [5 6 7 8 9]]
print(np.sum(a,0)) #轴在行上,每个元素代表这列元素的求和
#[ 5 7 9 11 13]
print(np.sum(a,1)) #轴在列上,每个元素代表这一行元素的和
# [10 35]
6.3 其他的统计方法
比纯python实现方便很多,且性能更好
import numpy as np
a=np.arange(10)
# [0 1 2 3 4 5 6 7 8 9]
print(a[a>5].size) #大于5的元素个数
# 4
print(a[a>5][:3]) #大于5的元素中的前三个元素
# [6 7 8]
6.4 其他通用函数
一些通用的数学函数,大家可以试试,不一一举例了
7.数组增加维度
7.1 np.newaxis
若是行升维,np.newaxis在行上,shape变成了1行10列,不再是(10,),只是在计算机层面多了一个维度,即多了个括号;
import numpy as np
a=np.arange(10)
# [0 1 2 3 4 5 6 7 8 9]
print(a.shape)
# (10,)
a1=a[np.newaxis,:]
print(a1,a1.shape) #注意看,有两个中括号,而且形状变成了1行10列
# [[0 1 2 3 4 5 6 7 8 9]] (1, 10)
a=a[:,np.newaxis]
print(a)
# [[0]
# [1]
# [2]
# [3]
# [4]
# [5]
# [6]
# [7]
# [8]
# [9]]
7.2np.expand_dims(a, axis)
import numpy as np
a=np.arange(10)
# [0 1 2 3 4 5 6 7 8 9]
print(a.shape)
# (10,)
a1=np.expand_dims(a,0)
print(a1,a1.shape)
# [[0 1 2 3 4 5 6 7 8 9]] (1, 10)
a2=np.expand_dims(a,1)
print(a2,a2.shape)
# [[0]
# [1]
# [2]
# [3]
# [4]
# [5]
# [6]
# [7]
# [8]
# [9]] (10, 1)
7.3 np.reshape(a,newshape)
import numpy as np
a=np.arange(10)
# [0 1 2 3 4 5 6 7 8 9]
print(a.shape)
# (10,)
a1=np.reshape(a,(1,-1))
print(a1)
# [[0 1 2 3 4 5 6 7 8 9]]
a2=np.reshape(a,(-1,1))
print(a2)
# [[0]
# [1]
# [2]
# [3]
# [4]
# [5]
# [6]
# [7]
# [8]
# [9]]
8.合并操作
8.1 np.concatenate(arr,[axis])
按照axis方向进行合并(axis默认为0)
注意:
axis=0时,只有列维度相同的数组才能进行合并!
当一维数组与二维数组进行合并的时候,需要进行升维
axis=1时,只有行维度相同才能进行合并
import numpy as np
a=np.arange(10)
# [0 1 2 3 4 5 6 7 8 9]
a=np.expand_dims(a,0) #因为arange形成的数组是一维的,
# 所以要把它升维,变成(1,10),
# 否者不能与下面的(2,10)数组进行合并
# [[0 1 2 3 4 5 6 7 8 9]]
a2=np.arange(20).reshape(2,10)
# [[ 0 1 2 3 4 5 6 7 8 9]
# [10 11 12 13 14 15 16 17 18 19]]
print(np.concatenate([a,a2]))
# [[ 0 1 2 3 4 5 6 7 8 9]
# [ 0 1 2 3 4 5 6 7 8 9]
# [10 11 12 13 14 15 16 17 18 19]]
8.2 np.vstack(arr)
按行进行合并,须列维度相等
与concatenate()中axis=0的情况一致
import numpy as np
a=np.arange(10)
# [0 1 2 3 4 5 6 7 8 9]
a=np.expand_dims(a,0) #因为arange形成的数组是一维的,
# 所以要把它升维,变成(1,10),
# 否者不能与下面的(2,10)数组进行合并
# [[0 1 2 3 4 5 6 7 8 9]]
a2=np.arange(20).reshape(2,10)
# [[ 0 1 2 3 4 5 6 7 8 9]
# [10 11 12 13 14 15 16 17 18 19]]
print(np.vstack([a,a2]))
# [[ 0 1 2 3 4 5 6 7 8 9]
# [ 0 1 2 3 4 5 6 7 8 9]
# [10 11 12 13 14 15 16 17 18 19]]
8.3 np.hstack(arr)
按列进行合并,须行维度相等
与concatenate()中axis=1的情况一致
import numpy as np
a=np.arange(10)
# [0 1 2 3 4 5 6 7 8 9]
a=np.reshape(a,(2,5))
print(a)
a2=np.arange(20).reshape(2,10)
# [[ 0 1 2 3 4 5 6 7 8 9]
# [10 11 12 13 14 15 16 17 18 19]]
print(np.hstack([a,a2]))
# [[ 0 1 2 3 4 0 1 2 3 4 5 6 7 8 9]
# [ 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19]]
9.分割操作
np.split(ary,indices_or_sections , axis)
依次是(分割的数据,分割份数,按照行或者列进行分割)
import numpy as np
x = np.arange(10)
# [[0 1 2 3 4]
# [5 6 7 8 9]]
print(np.split(x, 2))
# [array([[0, 1, 2, 3, 4]]), array([[5, 6, 7, 8, 9]])]
x = np.arange(10).reshape(2,5)
# [[0 1 2 3 4]
# [5 6 7 8 9]]
print(np.split(x, 2))
# [array([[0, 1, 2, 3, 4]]), array([[5, 6, 7, 8, 9]])]
总结
本文仅仅简单介绍了numpy的简单应用,想要进一步了解numpy,还需要进行大量的实战项目。
任重道远,道友,加油!!!