Numpy是Python中用于科学计算的核心库。它提供了一个高性能的多维数组对象,以及处理这些数组的工具。
1、数组
numpy数组是由相同类型的值组成的网格,并由一组非负整数进行索引。维数为数组的秩;数组的形状是一个整数元组,它给出了数组在每个维度上的大小。
从列表创建数组
1 import numpy as np 2 3 a = np.array([1, 2, 3]) # 通过列表创建一个一维数组 4 print(type(a)) # 输出 "<class 'numpy.ndarray'>" 5 print(a.shape) # 输出 "(3,)" 6 print(a[0], a[1], a[2]) # 输出 "1 2 3" 7 a[0] = 5 # 改变数组中的一个元素 8 print(a) # 输出 "[5, 2, 3]" 9 10 b = np.array([[1,2,3],[4,5,6]]) # 通过列表创建一个二维数组 11 print(b.shape) # 输出 "(2, 3)" 12 print(b[0, 0], b[0, 1], b[1, 0]) # 输出 "1 2 4"
通过函数创建数组
1 import numpy as np 2 3 a = np.zeros((2,2)) # 创建元素全为0的数组 4 print(a) # 输出 "[[ 0. 0.] 5 # [ 0. 0.]]" 6 7 b = np.ones((1,2)) # 创建元素全为1的数组 8 print(b) # 输出 "[[ 1. 1.]]" 9 10 c = np.full((2,2), 7) # 创建一个常数数组 11 print(c) # 数组 "[[ 7. 7.] 12 # [ 7. 7.]]" 13 14 d = np.eye(2) # 创建一个2*2的单位矩阵 15 print(d) # 输出 "[[ 1. 0.] 16 # [ 0. 1.]]" 17 18 e = np.random.random((2,2)) # 创建一个随机矩阵 19 print(e) # 输出 "[[ 0.91940167 0.08143941] 20 # [ 0.68744134 0.87236687]]"
2、数组索引
切片
使用切片得到的数组与原来的数组维数相同
1 import numpy as np 2 3 a = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]]) 4 5 b = a[:2,1:3] 6 7 print(a[0,1]) #输出结果为2 8 b[0,0] = 77 9 print(a[0,1]) #输出结果为77
也可以混合整数索引与切片,但这样会得到一个比原来数组维数低的数组
1 import numpy as np 2 3 a = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]]) 4 5 row_1 = a[1,:] 6 row_2 = a[1:2,:] 7 print(row_1,row_1.shape) #输出为[5,6,7,8] (4,) 8 print(row_2,row_2.shape) #输出为[[5,6,7,8]] (1,4) 9 10 col_1 = a[:,1] 11 col_2 = a[:,1:2] 12 print(col_1,col_1.shape) #输出为[2,6,10] (3,) 13 print(col_2,col_2.shape) #输出为[[2] 14 # [6] 15 # [10]] (3,1)
整数索引
1 import numpy as np 2 3 a = np.array([[1,2],[3,4],[5,6]]) 4 5 print(a[[0,1,2],[0,1,0]]) #索引数组的0,0 1,1 2,0元素,与下面的索引等价 6 print(np.array([a[0,0],a[1,1],a[2,0]]))
除此之外,整数索引可以用来实如下功能:对矩阵中的某些特定元素实现计算,如:
1 import numpy as np 2 3 a = np.array([[1,2,3],[4,5,6],[7,8,9]]) #[[1,2,3] 4 # [4,5,6] 5 # [7,8,9]] 6 #创建索引 7 b = [0,1,2] 8 9 print(a[np.arange(3),b]) 10 11 #实现数组中特定元素的计算 12 a[np.arange(3),b] += 10 13 print(a) 14 15 #输出结果为 16 # [[11 2 3] 17 # [ 4 15 6] 18 # [ 7 8 19]]
布尔索引
通常这类索引用于选取某些符合特定条件的数组元素
1 import numpy as np 2 3 a = np.array([[1,2], [3, 4], [5, 6]]) 4 5 bool_idx = (a > 2) # Find the elements of a that are bigger than 2; 6 # this returns a numpy array of Booleans of the same 7 # shape as a, where each slot of bool_idx tells 8 # whether that element of a is > 2. 9 10 print(bool_idx) # Prints "[[False False] 11 # [ True True] 12 # [ True True]]" 13 14 # We use boolean array indexing to construct a rank 1 array 15 # consisting of the elements of a corresponding to the True values 16 # of bool_idx 17 print(a[bool_idx]) # Prints "[3 4 5 6]" 18 19 # We can do all of the above in a single concise statement: 20 print(a[a > 2]) # Prints "[3 4 5 6]"
3、数据类型
通过arr.dtype可以查看数组的数据类型,也可以在创建数组的时候,通过dtype参数来指定数据的类型,如:
1 import numpy as np 2 3 a = np.array([1.,2,3],dtype = np.float32) 4 print(a.dtype)
4、数组的数学运算
1 import numpy as np 2 3 x = np.array([[1,2],[3,4]],dtype = np.float64) 4 y = np.array([[5,6],[7,8]],dtype = np.float64) 5 6 #[[6.8 8.0] 7 # [10.0 12.0]] 8 #两个输出结果一样 9 print(x + y) 10 print(np.add(x,y)) 11 12 #[[-4.0 -4.0] 13 # [-4.0 -4.0]] 14 #两个输出结果一样 15 print(x - y) 16 print(np.subtract(x,y)) 17 18 #[[5.0 12.0] 19 # [21.0 32.0]] 20 #两个输出结果一样 21 print(x * y) 22 print(np.multiply(x,y)) 23 24 #[[0.2 0.33333333] 25 # [0.42857143 0.5]] 26 #两个输出结果一样 27 print(x / y) 28 print(np.divide(x,y)) 29 30 #[[1. 1.41421356] 31 # [1.73205081 2.]] 32 print(np.sqrt(x))
1 import numpy as np 2 3 x = np.array([[1,2],[3,4]]) 4 y = np.array([[5,6],[7,8]]) 5 6 v = np.array([9,10]) 7 w = np.array([11,12]) 8 9 #向量的内积 10 #输出结果均为219 11 print(v.dot(w)) 12 print(np.dot(v,w)) 13 14 #矩阵与向量的成乘积 15 #输出结果均为[29 67] 16 print(x.dot(v)) 17 print(np.dot(x,v)) 18 19 #矩阵的内积 20 #输出结果为[[19 22] 21 # [43 50]] 22 print(x.dot(y)) 23 print(np.dot(x,y))
下面是一些数组计算的函数
1 import numpy as np 2 3 x = np.array([[1,2],[3,4]]) 4 5 #计算所有元素的和 6 print(np.sum(x)) 7 8 #计算每一列的和 9 print(np.sum(x,axis=0)) 10 11 #计算每一行的和 12 print(np.sum(x,axis=1))
更多的函数说明:点击这里
对数组的数据进行转置或者其他操作:
1 import numpy as np 2 3 x = np.array([[1,2],[3,4]]) 4 5 print(x) 6 print(x.T) 7 8 v = np.array([1,2,3]) 9 print(v) 10 print(v.T)
更多操作:点击这里
5、广播
数组的加减乘除等运算都是对应元素之间的计算
当数组的形状不一样时,我们可以通过扩展数组来实现计算,这种机制叫做广播
当运算的两个数组形状不相同,numpy自动触发广播机制
我们经常会使用一个较小的数组,对一个较大的数组进行运算,这时广播机制的作用就体现出来了
如:
1 import numpy as np 2 3 x = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]]) 4 v = np.array([1,0,1]) 5 6 y = x + v 7 print(y) 8 #输出结果为 9 # [[ 2 2 4] 10 # [ 5 5 7] 11 # [ 8 8 10] 12 # [11 11 13]]
广播机制的原则:
- 让所有输入数组都向其中形状最长的数组看齐,形状中不足的部分都通过在前面加 1 补齐。
- 输出数组的形状是输入数组形状的各个维度上的最大值。
- 如果输入数组的某个维度和输出数组的对应维度的长度相同或者其长度为 1 时,这个数组能够用来计算,否则出错。
- 当输入数组的某个维度的长度为 1 时,沿着此维度运算时都用此维度上的第一组值。
更多numpy模块知识,点击这里