人工智能基础-Python之Numpy库教程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

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. 1.shape:返回一个元组,表示他的维度(两行三列)
  2. 2.ndim:一个数字,表示array的维度的数目(2维)
  3. 3.size:表示所有数据元素的数目(共6个元素)
  4. 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.]]

  1. 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]]

  1. 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,还需要进行大量的实战项目。
任重道远,道友,加油!!!

  • 56
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值