深度学习之Numpy整理
一、Numpy介绍、为什么要用Numpy
1、Numpy介绍
Numpy是Python的一个扩展包,语法和Matlab有很多相似之处。它支持高维数组和矩阵运算,也提供了许多数组和矩阵运算的函数。另外,它在数组和矩阵运算方面速度很快,效率很高。
2、为什么要用Numpy
Numpy向量化计算与非向量化计算性能比较
# coding: utf-8
import time
import numpy as np
# Numpy向量化测试
a = np.random.rand(1000000)
b = np.random.rand(1000000)
tic = time.time()
c = np.dot(a,b)
toc = time.time()
print("计算结果"+str(c))
print("向量化使用时间:"+str(1000*(toc-tic)) + "ms")
# 使用for循环测试
c = 0
tic = time.time()
for i in range(1000000):
c += a[i] * b[i]
toc = time.time()
print("计算结果"+str(c))
print("循环使用时间:"+str(1000*(toc-tic)) + "ms")
#计算结果250011.92519533934
#向量化使用时间:0.9119510650634766ms
#计算结果250011.92519534056
#循环使用时间:466.2208557128906ms
为什么向量化比循环快?
因为Numpy对向量计算做了优化,用到了CPU或GPU的并行计算,所以速度要比单纯的for循环要快。具体细节感兴趣可以自行研究。
二、数组创建
1、生成数组
(1)一维数组
import numpy as np
x = np.array([1.0,2.0,3.0])
print(x)
# [1. 2. 3.]
x = np.np.arange(0,5)
print(x)
# [0 1 2 3 4]
各个元素与标量之间进行运算,称为广播。
(2)二维数组
A = np.array([[1,2],[3,4]])
A.shape
# 返回n*m的数组
A.dtype
# 返回数据类型
A.size
# 返回数组元素个数4
np.ndim(A)
#返回数组维数
3、访问元素
for row in A:
print(row)
A[0]
A[0][1]
A.flatten() #将X转换为一维数组
# [1 2 3 4]
A[np.array([0,1])]#获取索引为1、2的元素
#[[1 2]
#[3 4]]
A > 15 #获得布尔型数组
#[[False False]
# [False False]]
三、矩阵
1、创建矩阵
A = np.matrix('1,2;3,4')
print(A)
print(type((A)))
#[[1 2]
# [3 4]]
#<class 'numpy.matrixlib.defmatrix.matrix'>
2、数组转矩阵
A = np.array([[1,2],[3,4]])
#[[1 2]
# [3 4]]
B = np.mat(A)
print(B)
print(type(B))
#<class 'numpy.matrixlib.defmatrix.matrix'>
3、创建单位矩阵
E = np.eye(3)
#[[1. 0. 0.]
# [0. 1. 0.]
# [0. 0. 1.]]
4、改变数组形状
# 将2*2的数组变形为4*1的数组
A = np.array([[1,2],[3,4]])
A = A.reshape((A.size,1))
print(A)
#[[1]
#[2]
#[3]
#[4]]
四、计算
1、广播
为何叫广播,因为单个标量被广播、复制成n维数组。
如二维数组[[1,2],[3,4]]与标量10相乘,等同于[[1,2],[3,4]]乘以[[10,10],[10,10]]。
2、矩阵转置
因为np.random.randn(5)写法不直观,建议使用写法np.random.randn(5,1)。
a = np.random.randn(5,1)
#转置
b = a.T
print(a)
#[[-0.30232915]
# [-0.13689176]
# [ 0.74737671]
# [ 0.58641912]
# [ 0.14419141]]
print(a.T)
#[[-0.30232915 -0.13689176 0.74737671 0.58641912 0.14419141]]
3、矩阵乘法(点积)
(1)
import numpy as np
A = np.array([[1,2],[3,4]])
B = np.array([[5,6],[7,8]])
#点积
print(np.dot(A,B))
#array([[19, 22],[43, 50]])
(2)
a = np.random.randn(5,1)
b = a.T
# (5,1)(1,5)的点积得到的是5*5的矩阵
print(np.dot(a,b))
# (1,5)(5,1)的点积得到的是1*1的矩阵
print(np.dot(b,a))
4、矩阵求逆
\(AB=E\),矩阵A与B互为逆矩阵,其中E为单位矩阵,E的行列式计算为1
A = np.matrix('1,2;3,4')
print(A.I)#求逆
#[[-2. 1. ]
# [ 1.5 -0.5]]
E = np.dot(A,A.I)
print(E)
#[[1.0000000e+00 0.0000000e+00]
#[8.8817842e-16 1.0000000e+00]]
value = np.linalg.det(E)#行列式计算
#0.9999999999999996
4、算术运算
x = np.array([1.0,2.0,3.0])
y = np.array([2.0,3.0,4.0])
#减法
print(x - y)
# [-1. -1. -1.]
#加法
print(x + y)
#[3. 5. 7.]
#乘法
print(x * y)
#[ 2. 6. 12.]
#除法
print(x / y)
#[0.5 0.66666667 0.75 ]
#开方根
print(np.sqrt(x))
#[1. 1.41421356 1.73205081]
#对数
print(np.log(x))
#[0. 0.69314718 1.09861229]
# 指数
print(np.exp(a))
# [ 2.71828183 7.3890561 20.08553692]
5、平均值、方差、标准差
x = np.array([1,2,3,4,5,6])
# 平均值
np.mean([1,2,3,4])
# 3.5
# 方差
print(np.var(x))
#2.9166666666666665
# 标准差
print(np.std(x))
#1.707825127659933
五、应用
1、sigmoid函数
def sigmoid(x):
s = 1.0 / (1.0 + np.exp(-x))
return s
2、sigmoid求导
def sigmoid_derivative(x):
s = sigmoid(x)
ds = s*(1-s)
return ds
3、softmax函数计算
def softmax(x):
x_exp = np.exp(x)
x_sum = np.sum(np.exp(x),axis=1,keepdims = True)
s = x_exp / x_sum
return s
4、计算损失函数
def L1(yhat, y):
loss = np.sum(np.abs(yhat - y))
return loss
def L1(yhat, y):
loss = np.sum((y - yhat)**2)
return loss
5、向量化练习
x1 = [9, 2, 5, 0, 0, 7, 5, 0, 0, 0, 9, 2, 5, 0, 0]
x2 = [9, 2, 2, 9, 0, 9, 2, 5, 0, 0, 9, 2, 5, 0, 0]
### VECTORIZED DOT PRODUCT OF VECTORS ###
tic = time.process_time()
dot = np.dot(x1,x2)
toc = time.process_time()
print ("dot = " + str(dot) + "\n ----- Computation time = " + str(1000*(toc - tic)) + "ms")
### VECTORIZED OUTER PRODUCT ###
tic = time.process_time()
outer = np.outer(x1,x2)
toc = time.process_time()
print ("outer = " + str(outer) + "\n ----- Computation time = " + str(1000*(toc - tic)) + "ms")
### VECTORIZED ELEMENTWISE MULTIPLICATION ###
tic = time.process_time()
mul = np.multiply(x1,x2)
toc = time.process_time()
print ("elementwise multiplication = " + str(mul) + "\n ----- Computation time = " + str(1000*(toc - tic)) + "ms")
### VECTORIZED GENERAL DOT PRODUCT ###
tic = time.process_time()
dot = np.dot(W,x1)
toc = time.process_time()
print ("gdot = " + str(dot) + "\n ----- Computation time = " + str(1000*(toc - tic)) + "ms")
参考文档
深度学习之Numpy整理的更多相关文章
- (zhuan) 126 篇殿堂级深度学习论文分类整理 从入门到应用
126 篇殿堂级深度学习论文分类整理 从入门到应用 | 干货 雷锋网 作者: 三川 2017-03-02 18:40:00 查看源网址 阅读数:66 如果你有非常大的决心从事深度学习,又不想在这一行打 ...
- python深度学习培训概念整理
对于公司组织的人工智能学习,每周日一天课程共计五周,已经上了三次,一天课程下来讲了两本书的知识.发现老师讲的速度太快,深度不够,而且其他公司学员有的没有接触过python知识,所以有必要自己花时间多看 ...
- 深度学习之numpy.poly1d()函数
1.np.poly1d()此函数有两个参数: 参数1:为一个数组,若没有参数2,则生成一个多项式,例如: p = np.poly1d([2,3,5,7]) print(p) ==>> ...
- GitHub 上 57 款最流行的开源深度学习项目
转载:https://www.oschina.net/news/79500/57-most-popular-deep-learning-project-at-github GitHub 上 57 款最 ...
- 【PyTorch】深度学习与PyTorch资料链接整理
欢迎来到我的博客! 以下链接均是日常学习,偶然得之,并加以收集整理,感兴趣的朋友可以多多访问和学习.如果以下内容对你有所帮助,不妨转载和分享.(Update on 5,November,2019) 1 ...
- 深度学习框架搭建之最新版Python及最新版numpy安装
这两天为了搭载深度学习的Python架构花了不少功夫,但是Theano对Python以及nunpy的版本都有限制,所以只能选用版本较新的python和nunpy以确保不过时.但是最新版Python和最 ...
- 给深度学习入门者的Python快速教程 - numpy和Matplotlib篇
始终无法有效把word排版好的粘贴过来,排版更佳版本请见知乎文章: https://zhuanlan.zhihu.com/p/24309547 实在搞不定博客园的排版,排版更佳的版本在: 给深度学习入 ...
- Deep Learning(深度学习)学习笔记整理系列之(五)
Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...
- Deep Learning(深度学习)学习笔记整理系列之(八)
Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...
随机推荐
- 使用清华源替代Ubuntu源
sudo nano /etc/apt/source.list 替换为如下文本 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main ...
- Spring Boot实战笔记(二)-- Spring常用配置(Scope、Spring EL和资源调用)
一.Bean的Scope Scope描述的是Spring容器如何新建Bean实例的.Spring的Scope有以下几种,通过@Scope注解来实现. (1)Singleton:一个Spring容器中只 ...
- echarts3 迁徙图 迁入迁出
geoCoordMap = { '上海': [121.4648,31.2891], '佛山': [112.8955,23.1097], '保定': [115.0488,39.0948], '兰州': ...
- 【转】网上看到的“12个非常有用的JavaScript技巧”
1) 使用!!将变量转换成布尔类型 有时,我们需要检查一些变量是否存在,或者它是否具有有效值,从而将它们的值视为true.对于做这样的检查,你可以使用!!(双重否定运算符),它能自动将任何类型的数据转 ...
- Centos下安装Python的问题汇总
Python下载地址(https://www.python.org/ftp/python/) 一.工具安装 1.Python的安装 tar vxf Python-2.7.13.tgz cd Pytho ...
- zabbix监控mysql性能
使用zabbix监控mysql的三种方式 1.只是安装agent 2.启用模板监控 3.启用自定义脚本的模板监控 zabbix中默认有mysql的监控模板.默认已经在zabbix2.2及以上的版本中. ...
- Python接口测试之对MySQL/unittest框架/Requests 的操作
单元测试支持测试自动化. 共享的安装程序和关闭代码测试. 聚合成集合,测试和报告框架从测试的独立性.单元测试模块提供可以很容易地支持这些素质的一组测试的类.关于unittest 测试框架建议可以到官方 ...
- .Net中集合排序的一种高级玩法
背景: 学生有名称.学号, 班级有班级名称.班级序号 学校有学校名称.学校编号(序号) 需求 现在需要对学生进行排序 第一排序逻辑 按学校编号(序号)排列 再按班级序号排列 再按学生学号排列 当然,在 ...
- 架构选型之Nodejs与Java
前言: 身边越来越多的同事谈论Nodejs,谈其异步IO.事件回调.前后台统一一门语言,创业的朋友的第一个创业项目也选择了Nodejs,期望能够使用一种语言节省成本快速完成需求开发.与其他项目组的同事 ...
- nake_api_protect 请求保护器——防止请求被恶意刷
github : https://github.com/xjnotxj/wechat_interaction_auth -- nake_api_protect 接口请求保护器,根据 频率 + 次数 的 ...