Numpy算数运算
数组不用循环即可对每个元素执行批量的算术运算操作,这个过程叫做矢量化,用数组表达式代替循环的做法,矢量化数组运算性能比纯Python方式快上一两个数据级,大小相等的两个数组之间的任何算术运算都会将其运算应用到元素级上的操作
元素级操作:在NumPy中,大小相等的数组之间的运算,为元素级运算,即只用于位置相同的元素之间,所得的运算结果组成一个新的数组,运算结果的位置跟操作数位置相同
import numpy as np a = np.arange(3).reshape(3) b = np.array([2,3,4]) print(a) #输出为 [0 1 2] print(b) #输出为 [2 3 4] #标量运算 print(a+1) #输出为 [1 2 3] print(a-1) #输出为 [-1 0 1] print(a*2) #输出为 [0 2 4] print(a/2) #输出为 [0. 0.5 1. ] print(2/b) #输出为 [1. 0.66666667 0.5 ] print(a**2) #输出为 [0 1 4] print(2**a) #输出为 [1 2 4] #两个数组相加,以下两种方式输出结果一样 print(a+b) #输出为 [2 4 6] print(np.add(a,b)) #输出为 [2 4 6] #两个数组相减,以下两种方式输出结果一样 print(a-b) #输出为 [-2 -2 -2] print(np.subtract(a,b)) #输出为 [-2 -2 -2] #两个数组相乘,以下两种方式输出结果一样 print(a*b) #输出为 [0 3 8] print(np.multiply(a,b)) #输出为 [0 3 8] #两个数组相除,以下两种方式输出结果一样 print(a/b) #输出为 [0. 0.33333333 0.5 ] print(np.divide(a,b)) #输出为 [0. 0.33333333 0.5 ] #两个数组取幂,以下两种方式输出结果一样 print(a**b) #输出为 [ 0 1 16] print(np.power(a,b)) #输出为 [ 0 1 16] #mod 两个数组取余,以下两种方式输出结果一样 a = np.array([10,20,30]) b = np.array([3,5,7]) print(np.mod(a,b)) #输出为 [1 0 2] print(np.remainder(a,b)) #输出为 [1 0 2]
ndarray数组的矩阵积
矩阵:多维数组即矩阵
矩阵积:两个二维矩阵(行和列的矩阵)满足第一个矩阵的列数与第二个矩阵的行数相同,那么可以进行矩阵的乘法,即矩阵积,矩阵积不是元素级的运算,也称为点积、数量积
import numpy as np arr1 = np.array([[1,0,0], [1,1,0], [0,2,1]]) arr2 = np.array([[1,2], [3,4], [5,6]]) print(arr1.dot(arr2)) #输出为 [[ 1 2] # [ 4 6] # [11 14]]
Numpy广播
术语广播是指 NumPy 在算术运算期间处理不同形状的数组的能力,对数组的算术运算通常在相应的元素上进行,如果两个阵列具有完全相同的形状,则这些操作无缝执行,如果两个数组的维数不相同,则元素到元素的操作是不可能的,然而,在 NumPy 中仍然可以对形状不相似的数组进行操作,因为它拥有广播功能,较小的数组会广播到较大数组的大小,以便使它们的形状可兼容
如果满足以下规则,可以进行广播:让所有输入数组都向其中shape最长的数组看齐,shape中不足的部分都通过在前面加1补齐,输出数组的shape是输入数组shape的各个轴上的最大值,如果输入数组的某个轴和输出数组的对应轴的长度相同或者其长度为1时,这个数组能够用来计算,否则出错,当输入数组的某个轴的长度为1时,沿着此轴运算时都用此轴上的第一组值
import numpy as np a = np.array([[1,2,3,4]]) b = np.array([[10,20,30,40],[1,2,3,4]]) c = a * b print(c) #输出为 [[ 10 40 90 160] # [ 1 4 9 16]]