2018年的第一篇博客,期末结束后又投入到自己的big project中,有点累想要慢下来思考思考,也想记录记录学习的内容。最近看完吴恩达的深度学习视频,发现numpy的特别之处,给计算提供了很大的便利性,觉得应该好好来学习学习。
一.numpy简介
Numpy 是Python中科学计算的核心库。它提供一个高性能多维数据对象,以及操作这个对象的工具。
二.numpy的安装
sudo pip install numpy
如无意外,用pip的安装方法可以顺利完成~~
要是你这么不幸,就试试手动吧~
Numpy下载地址:http://sourceforge.net/projects/numpy/files/NumPy
三.numpy的使用
1.导入numpy
import numpy as np
导入时将np作为numpy的别名,这是一种习惯性的用法~
2.基本类型array
array,也就是数组,是numpy中最基础的数据结构,最关键的属性是维度和元素类型,在numpy中,可以非常方便地创建各种不同类型的多维数组,并且执行一些基本基本操作,如下:
# 通过给array函数传递Python的序列对象创建数组,如果传递的是多层嵌套的序列,将创建多维数组(下例中的变量c)
a = np.array([1, 2, 3, 4])
b = np.array((5, 6, 7, 8))
c = np.array([[1, 2, 3, 4],[4, 5, 6, 7], [7, 8, 9, 10]])
# 数组的大小可以通过其shape属性获得
print a.shape # (4,) ——>一维数组
print a.argmax() # 3
print a.max() # 4
print a.mean() # 2.5
# 多维数组需加入axis=参数
print c.shape # (3,4) ——>二维数组
print c.max(axis=1)
# 使用数组的reshape方法,可以创建一个改变了尺寸的新数组,原数组的shape保持不变
d = a.reshape((2,2)) # 深度学习中利用此方法避免运算中数组错误
# 3x3的浮点型2维数组,并且初始化所有元素值为1
e = np.ones((3, 3), dtype=np.float)
# 创建一个一维数组,元素值是把3重复4次,array([3, 3, 3, 3])
f = np.repeat(3, 4)
np.save('f.npy', f) # 保存到文件
f = np.load('f.npy') # 从文件读取
3.数学运算
(1)基础运算
import numpy as np
# 绝对值,1
a = np.abs(-1)
# sin函数,1.0
b = np.sin(np.pi/2)
# tanh逆函数,0.50000107157840523
c = np.arctanh(0.462118)
# e为底的指数函数,20.085536923187668
d = np.exp(3)
# 2的3次方,8
f = np.power(2, 3)
# 点积,1*3+2*4=11
g = np.dot([1, 2], [3, 4])
# 开方,5
h = np.sqrt(25)
# 求和,10
l = np.sum([1, 2, 3, 4])
# 平均值,5.5
m = np.mean([4, 5, 6, 7])
# 标准差,0.96824583655185426
p = np.std([1, 2, 3, 2, 1, 3, 2, 0])
(2)广播
对于array,默认执行对位运算。涉及到多个array的对位运算需要array的维度一致,如果一个array的维度和另一个array的子维度一致,则在没有对齐的维度上分别执行对位运算,这种机制叫做广播(broadcasting),常常在深度学习的视频里听到:
a = np.array([
[1, 2, 3],
[4, 5, 6]
])
b = np.array([
[1, 2, 3],
[1, 2, 3]
])
'''
维度一样的array,对位计算
array([[2, 4, 6],
[5, 7, 9]])
'''
a + b
c = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[10, 11, 12]
])
d = np.array([2, 2, 2])
'''
广播机制让计算的表达式保持简洁
d和c的每一行分别进行运算
array([[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11],
[12, 13, 14]])
'''
c + d
(3)线性代数模块
在深度学习相关的数据处理和运算中,线性代数模块(linalg)是最常用的之一。结合numpy提供的基本函数,可以对向量,矩阵,或是说多维张量进行一些基本的运算:
a = np.array([3, 4])
np.linalg.norm(a)
b = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
c = np.array([1, 0, 1])
# 矩阵和向量之间的乘法
np.dot(b, c) # array([ 4, 10, 16])
np.dot(c, b.T) # array([ 4, 10, 16])
np.trace(b) # 求矩阵的迹,15
np.linalg.det(b) # 求矩阵的行列式值,0
np.linalg.matrix_rank(b) # 求矩阵的秩,2,不满秩,因为行与行之间等差
(4)random模块
随机模块包含了随机数产生和统计分布相关的基本函数
import numpy.random as random
# 设置随机数种子
random.seed(42)
# 产生一个[0,1)之间的浮点型随机数
random.random()
# 下边4个没有区别,都是按照指定大小产生[0,1)之间的浮点型随机数array,不Pythonic…
random.random((3, 3))
random.sample((3, 3))
random.random_sample((3, 3))
random.ranf((3, 3))
# 产生2x5的标准正态分布样本
random.normal(size=(5, 2))
# 产生5个,n=5,p=0.5的二项分布样本
random.binomial(n=5, p=0.5, size=5)
a = np.arange(10)
# 从a中有回放的随机采样7个
random.choice(a, 7)
# 从a中无回放的随机采样7个
random.choice(a, 7, replace=False)
# 对a进行乱序并返回一个新的array
b = random.permutation(a)
深度学习中涉及挺多微积分知识,滚去继续学习了~