Numpy
Numpy是Python中做科学计算的核心库之一,它提供了一个高效多维数组实体(object),和对这些数组的各种功能函数。
1.Array
一组同类型的数据,可以由一个非负整数来进行索引查询里面的元组。
-
初始化
a) 指定数组import numpy as np a = np.array[1,2,3]) b = np.array([1,2,3],[4,5,6])
b) 全零数组
a = np.zeros((2,2))
a = [ [0,0]
[0,0] ]
c) 全一数组b = np.ones((2,2))
b = [ [1,1]
[1,1] ]
d) 全填同一数值c = np.full((2,2),7)
c = [ [7,7]
[7,7] ]
e) 单位矩阵(我有时候习惯用矩阵来方便计算思考)d = np.eye(2)
d = [ [1,0]
[0,1] ]
f) 随机生成矩阵e = np.random.random((2,2))
e = [ [0.25783470,0.72843901]
[0.84993205,0.23794522] ]2.Array indexing
Numpy提供一些数组的检索方式(我也不确定叫做‘检索’是否准确,不过看具体函数明白是干什么的就可以)
a) 切片Slicing(一些我不确定翻译都带上原文
和Python中的列表操作一样,Numpy的数组也可以被切片。因为数组本身可能是多维的,所以需要定义片的样式。imoprt numpy an np a = np.array([1,2,3,4],[5,6,7,8],[9,10,11,12]]) # a = [[1,2,3,4] [5,6,7,8] [9,10,11,12]] b = a[:2,1:3] # b = [[2,3] [6,7]] # 注意此时如果修改b的值,在a中对应的值也会相应改变 print (a[0,1]) #2 print (b[0,0]) #2 b[0,0] = 77 print (a[0,1]) #77
b) 整型数组索引
整型数组索引允许我们使用一个数组的数据来组成一个全新数组。import numpy as np a = np.array([[1,2],[3,4],[5,6]]) print (a[[0,1,2],[0,1,0]]) #[1,4,5]
一个有用的小技巧是使用整型索引来从一个矩阵的每一行中选取或改变一个元素。
import numpy as np a = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]]) # a = [[1,2,3] [4,5,6] [7,8,9] [10,11,12] b = np.array([0,2,0,1]) print (a[np.arange(4),b]) # [1,6,7,11] a[np.arange(4),b] += 10 #a = [[11,2,3] [4,5,16] [17,8,9] [10,21,12]
c)布尔数组索引
布尔数组索引允许我们从一个数组从提取任意元素。通常用来筛选元素。import numpy as np a = np.array([[1,2],[3,4],[5,6]]) bool_idx = (a>2) print (bool_idx) # [[False,False] [True,True] [True,True]] print (a[bool_idx]) #[3,4,5,6] print (a[a>2]) # [3,4,5,6]
3.Datatype数据类型
每一个numpy数组由一系列同类型的元素组成。numpy提供了许多数值类型,并尝试在用户定义数组的时候去猜测数据的类型,构造数组的函数也包含一个可选参数用于明确生命数据类型。
import numpy as np x = np.array([1,2]) print(x.dtype) # int64 x = np.array([1,2],dtype = np.int64)
4.数组的数学运算
import numpy as np x = np.array([[1,2],[3,4]]) y = np.array([[5,6],[7,8]])
加
add = x+y add = np.add(x,y)
[[6,8]
[10,12]]减
sub = x-y sub = np.subtract(x,y)
[[-4,-4]
[-4,-4]]乘
mult = x*y mult = np.multiply(x,y)
[[5,12]
[21,32]]
注意,*运算符是指矩阵内对应位置的元素相乘,并不是矩阵相乘。矩阵乘运算的函数是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]) print (v.dot(w)) # 219 print (np.dot(v,w)) # 219 print (x.dot(y)) #[29,67] print (np.dot(v,w)) #[29,67] print (x.dot(y)) print (np.dot(x,y)) #[[19,22] [43,50]]
除
print (x/y) print (np.divide(x,y))
开根号
print (np.sqrt(x))
矩阵内元素求和
x = np.array([[1,2],[3,4]]) print (np.sum(x)) #10 print (np.sum(x,axis=0)) #[4,6]列求和 print (np.sum(x,axis=1)) #[3,7]行求和
除了使用数学函数,我们也时常需要调整矩阵大小或者进行数据调整(矩阵倒置什么的)
import numpy as np x = np.array([[1,2],[3,4]]) print (x) #[[1,2] [3,4]] print (x.T) #[[1,3] [2,4]]
5.Broadcasting
Broadcasting 是一种强大的机制(mechanism),当在较大的矩阵上进行关键操作时,可以使用不同形状的矩阵。(英语太差了,理解不能,原文附上:
Broadcasting is a powerful mechanism that allows numpy to work with array of different shapes when performing arithmetic operations.Frequently we have a smaller array and a large array, and we want to use the smaller array multiple times to perform some operation on the larger array.)
还是看例子:import numpy as np x = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]]) v = np.array([1,0,1]) y = np.empty_like(x) for i in range(4): y[i,:] = x[i,:] + v
上述是一种方式,但是当矩阵x非常大的时候,计算一个指定的循环在python中将会比较慢。注意到将矩阵v的每一行和矩阵x相加能达到上述效果,所以可以使用向量v构造一个矩阵w,使w和x相加。
import numpy as np x = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]]) v = np.array([1,0,1]) w = np.tile(v,(4,1)) y = x + w
numpy 的broadcasting甚至允许我们如下操作来完成:
import numpy as np x = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]]) v = np.array([1,0,1]) y = x + v