深度学习之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)创建shape相同的zero数组

Return an array of zeros with the same shape and type as a given array.


>>> x = np.arange(6)
>>> x = x.reshape((2, 3))
>>> x
array([[0, 1, 2],
       [3, 4, 5]])
>>> np.zeros_like(x)
array([[0, 0, 0],
       [0, 0, 0]])

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求导

sigmoid求导.png


def sigmoid_derivative(x):
    s = sigmoid(x)
    ds = s*(1-s)
    return ds

3、softmax函数计算

softmax.png

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、计算损失函数

loss functions.png

def L1(yhat, y):
    loss = np.sum(np.abs(yhat - y))
    return loss
loss functions.png

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

4、四维数组

四维数组.png

创建一个四维数组


four = np.array([[[[1,2,3,4,5],[1,2,3,4,5]]],[[[9,10,11,12,13],[9,10,11,12,13]]]])

print(four)
#[[[[ 1  2  3  4  5]
   #[ 1  2  3  4  5]]]


 #[[[ 9 10 11 12 13]
   #[ 9 10 11 12 13]]]]

print(four.shape)
#(2, 1, 2, 5)
#说明一个四维数组包含2个三维数组
#每个三维数组包含1个二维数组
#每个二维数组包含2个一维数组
#每个一维数组包含5个元素

参考文档

Numpy 1.15.4官方文档

神经网络和深度学习-吴恩达——Vectorization

numpy基本方法总结

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容

  • 基础篇NumPy的主要对象是同种元素的多维数组。这是一个所有的元素都是一种类型、通过一个正整数元组索引的元素表格(...
    oyan99阅读 5,102评论 0 18
  • 来源:NumPy Tutorial - TutorialsPoint 译者:飞龙 协议:CC BY-NC-SA 4...
    布客飞龙阅读 32,644评论 6 96
  • 先决条件 在阅读这个教程之前,你多少需要知道点python。如果你想从新回忆下,请看看Python Tutoria...
    舒map阅读 2,561评论 1 13
  • NumPy是Python中关于科学计算的一个类库,在这里简单介绍一下。 来源:https://docs.scipy...
    灰太狼_black阅读 1,220评论 0 5
  • 资料来源:https://github.com/BrambleXu/pydata-notebook 在这篇附录中,...
    林清猫耳阅读 929评论 0 4