Numpy基础

Numpy foundation for deep learning

Posted by baiyf on November 10, 2017

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