Numpy 是Python中进行科学计算的库函数,可以处理高性能的多维矩阵运算.
Numpy
1.数组
import numpy as np
a = np.array([1,2,3]) #定义一维数组
b = np.array([[1,2,3],[4,5,6]]) #定义二维数组
print(a.shape) #print "(3,)"
print(b.shape) #print "(2,3)"
numpy也提供了许多有用的数组函数:
import numpy as np
a = np.zeros((2,2)) # 定义一个全部元素为0的数组
print(a) # print "[[0. 0.]
# . . . . [0. 0.]"
b = np.ones((1,2)) # 定义一个全部元素为1的数组
print(b) # print "[[1. 1.]]"
c = np.full((2,2),7) # 定义一个常数数组
print(c) # print "[[7. 7.]
# . . . . [7. 7.]]"
d = np.eye(2) # 定义一个2x2的单位矩阵
print(d) # print "[[1. 0.]"
# . . . . [0. 1.]]"
e = np.random.random((2,2)) # 定义一个2x2的随机数组
print(e)
f = np.arange(5) # 类似range,array([0, 1, 2, 3, 4])
g = np.linspace(0, 6, 5) # 等差数列,0到6之间5个取值,
# array([ 0., 1.5, 3., 4.5, 6.])
h = np.arange(6).reshape((2, 3)) # print "[[1 2 3]
print(h) # . . . . [4 5 6]]
2.数组索引
切片
类似于Python的list,numpy数组也有切片的方法.对于高维数组,可以指定每一维的切片
import numpy as np
#定义一个3x4的数组
#[[1 2 3 4]
# [5 6 7 8]
# [9 10 11 12]
a = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
b = a[:2,1:3] # b = a[0:2,1:3]
#[[2 3]
# [6 7]]
也可以将数组索引和切片索引混用,但是这样会把数组降维:
import numpy as np
#定义一个3x4的数组
#[[1 2 3 4]
# [5 6 7 8]
# [9 10 11 12]
a = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
row_r1 = a[1,:] # [5 6 7 8] shape=(4,)
row_r2 = a[1:2,:] # [[5 6 7 8]] shape=(1,4)
col_c1 = a[:,1] # [2 6 10] shape=(3,)
col_c2 = a[:,1:2] # [[2]
#. [6]
#. [10]] shape=(3,1)
整数数组索引
用切片的方式总是可以取出一个和原数组同维的数组,而数组索引可以取出数组内的任何数
import numpy as np
a = np.array([[1,2],[3,4],[5,6]])
print(a[[0,1,2],[0,1,0]]) # print "[1 4 5]"
print(np.array(a[0,0],a[1,1],a[2,0]))
print(a[[0,0],[1,1]]) # print "[2 2]"
print(np.array([a[0,1],a[0,1]]))
布尔数组索引
布尔数组索引用来选出数组中满足一定条件的数
import numpy as np
a = np.array([[1,2],[3,4],[5,6]])
bool_idx = a>2
print(bool_idx) # print "[False False]
#. . . . [ True True]
#. . . . [ True True]"
print(a[bool_idx]) # print "[3 4 5 6]"布尔
# 数组索引的结果是一个一维数组
3.数据类型
Numpy有很多种数据类型,在你定义数组时Numpy会自动猜测你定义的数据类型,当然你也可以手动定义数据类型:
import numpy as np
x = np.array([1,2]) # numpy自动定义类型
print(x.dtype) # print "int64"
x = np.array([1.,2.]) # numpy自动定义类型
print(x.dtype) # print "float64"
x = np.array([1,2],dtype=np.int64) # 强制定义类型
print(x.dtype) # print "int64"
4.数组运算
Numpy的数学运算支持基本运算符也支持numpy的数学函数
import numpy as np
x = np.array([[1,2],[3,4]],dtype=np.float64)
y = np.array([[5,6],[7,8]],dtype=np.float64)
print(x + y) # print "[[ 6.0 8.0]
print(np.add(x,y)) # . . . . [10.0 12.0]]"
print(x - y) # print "[[-4.0 -4.0]
print(np.subtract(x,y)) # . . . . [-4.0 -4.0]]"
print(x * y) # print "[[ 5.0 12.0]
print(np.multiply(x,y)) # . . . . [ 21.0 32.0]]"
print(x / y) # print "[[ 0.2 0.333]
print(np.divide(x,y)) # . . . . [0.428 0.5]]"
print(np.sqrt(x)) # print "[[ 1. 1.414]
# . . . . [1.732 2. ]]"
Numpy用dot函数表示数组乘积,常用来计算矩阵乘法
import numpy as np
x = np.array([[1,2],[3,4]])
y = np.array([[5,6],[7,8]])
v = np.array([9,10])
w = np.array([11,12])
# 向量内积,结果都是219
print(v.dot(w))
print(np.dot(v,w))
# 矩阵与向量积,结果都是一维数组[29 67]#分行内积
print(x.dot(v))
print(np.dot(x,v))
# 矩阵与矩阵积,结果是一个二维数组#相当于矩阵乘法
#[[19 22]
# [43 50]]
print(x.dot(y))
print(np.dot(x,y))
Numpy可以用sum函数计算数组的和,在深度学习应用中很常见:
import numpy as np
x = np.array([[1,2],[3,4]])
print(np.sum(x)) # print "10"
print(np.sum(x,axis=0)) # print "[4 6]" axis=0按列求和
print(np.sum(x,axis=1)) # print "[3 7]" axis=1按行求和
Numpy用T来表示数组的转置:
import numpy as np
x = np.array([[1,2],[3,4]])
print(x) # print "[[1 2]
# . . . . [3 4]]"
print(x.T) # print "[[1 3]
# . . . . [2 4]]"
# 一维数组的转置还是一维数组本身
5.广播
广播是处理不同形状数组之间运算的一种很方便的手段,实现过程是较小的数组反复使用多次与较大的数组进行运算
import tensorflow as tf
x = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
v = np.array([1,0,1])
print(x + v) # print "[[ 2 2 4]
# . . . . [ 5 5 7]
# . . . . [ 8 8 10]
# . . . . [11 11 13]]"
Matplotlib
1.plotting
matplotlib中最重要的函数就是plot(),可以画2维图
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0,3*np.pi,0.1)
y = np.sin(x)
plt.plot(x,y)
plt.show() # 画出一个sin函数图
这里区分一下np.arange()和np.linespace()两个函数
arange()类似于内置函数range(),通过指定开始值、终值和步长创建表示等差数列的一维数组,注意得到的结果数组不包含终值。
linspace()通过指定开始值、终值和元素个数创建表示等差数列的一维数组,可以通过endpoint参数指定是否包含终值,默认值为True,即包含终值。
plot()画出的图可以加上图名图例标题等
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0,3*np.pi,0.1)
y_sin = np.sin(x)
y_cos = np.cos(x)
plt.plot(x,y_sin)
plt.plot(x, y_cos)
plt.xlabel('x axis label')
plt.ylabel('y axis label')
plt.title('Sine and Cosine')
plt.legend(['Sine', 'Cosine'])
plt.show()
2.Subplots
Subplot()函数可以在同一张图中画出多个子图
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0, 3 * np . pi, 0.1)
y_sin = np.sin(x)
y_cos = np.cos(x)
# 定义一个高度=2,宽度=1的子图
# 并且设定第一个子图有效
plt.subplot(2, 1, 1)
# 画第一个图
plt.plot(x, y_sin)
plt.title('Sine')
# 设定第二个子图有效
plt.subplot(2, 1, 2)
plt.plot(x, y_cos)
plt.title('Cosine')
plt.show()