Python: numpy模块
numpy 模块
内容基于jupyter notebook而来,In [*]以下内容为代码,Out[*]为输出结果;
由于执行顺序不一样,可能会有些数据上下文衔接不上,重点是使用方法。
-
NumPy(Numerical Python) 是 Python 语言中做科学计算的基础库。重在于数值计算,也是大部分Python科学计算库的基础,多用于在大型、多维数组上执行的数值运算。
In [3]: import numpy as np # 使用array()来创建一个一维数组 arr = np.array([1,2,3,4,5]) arr Out[3]: array([1, 2, 3, 4, 5]) In [6]: # 使用array()来创建一个多维数组 np.array([[1,2,3,4,5],[6,7,8,9,10]]) Out[6]: array([[ 1, 2, 3, 4, 5], [ 6, 7, 8, 9, 10]])
数组中存储的数据元素类型必须是统一类型
优先级:字符串 > 浮点型 > 整数
In [7]: np.array([[1,2,3],[4.1,5,6]]) Out[7]: array([[1. , 2. , 3. ], [4.1, 5. , 6. ]])
用numpy的routines函数来创建数组:zeros(),ones(),linespace(),arange(),random
In [35]: np.zeros(5) Out[35]: array([0., 0., 0., 0., 0.]) In [36]: np.ones(shape=(2,3)) Out[36]: array([[1., 1., 1.], [1., 1., 1.]]) In [38]: np.linspace(0,20,num=4) Out[38]: array([ 0. , 6.66666667, 13.33333333, 20. ]) In [39]: np.arange(0,20,step=2) Out[39]: array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18]) In [42]: # 随机 np.random.randint(0,20,size=(2,3)) Out[42]: array([[ 7, 19, 17], [ 8, 3, 14]]) In [46]: # 固定随机性 # np.random.seed()的作用: 当设置相同的seed时,每次生成的随机数也相同,如果不设置seed,则每次生成的随机数都会不一样 np.random.seed(23) np.random.randint(0,20,size=(2,3)) Out[46]: array([[19, 6, 8], [ 9, 8, 13]]) In [47]: arr.shape # 形状 Out[47]: (2, 5) In [48]: arr.ndim #维度 Out[48]: 2 In [49]: arr.size # 返回元素个数 Out[49]: 10 In [53]: type(arr) Out[53]: numpy.ndarray In [50]: arr.dtype # 数组元素类型 Out[50]: dtype('int32')
array(dtype=?):可以设定数据类型
arr.dtype = '?':可以修改数据类型
In [35]: np.zeros(5) Out[35]: array([0., 0., 0., 0., 0.]) In [36]: np.ones(shape=(2,3)) Out[36]: array([[1., 1., 1.], [1., 1., 1.]]) In [38]: np.linspace(0,20,num=4) Out[38]: array([ 0. , 6.66666667, 13.33333333, 20. ]) In [39]: np.arange(0,20,step=2) Out[39]: array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18]) In [42]: # 随机 np.random.randint(0,20,size=(2,3)) Out[42]: array([[ 7, 19, 17], [ 8, 3, 14]]) In [46]: # 固定随机性 # np.random.seed()的作用: 当设置相同的seed时,每次生成的随机数也相同,如果不设置seed,则每次生成的随机数都会不一样 np.random.seed(23) np.random.randint(0,20,size=(2,3)) Out[46]: array([[19, 6, 8], [ 9, 8, 13]]) In [47]: arr.shape # 形状 Out[47]: (2, 5) In [48]: arr.ndim #维度 Out[48]: 2 In [49]: arr.size # 返回元素个数 Out[49]: 10 In [53]: type(arr) Out[53]: numpy.ndarray In [50]: arr.dtype # 数组元素类型 Out[50]: dtype('int32')
常用的统计函数
numpy.amin() 和 numpy.amax(),用于计算数组中的元素沿指定轴的最小、最大值。
numpy.ptp():计算数组中元素最大值与最小值的差(最大值 - 最小值)。
numpy.median() 函数用于计算数组 a 中元素的中位数(中值)
标准差std():标准差是一组数据平均值分散程度的一种度量。
公式:std = sqrt(mean((x - x.mean())**2))
如果数组是 [1,2,3,4],则其平均值为 2.5。 因此,差的平方是 [2.25,0.25,0.25,2.25],并且其平均值的平方根除以 4,即 sqrt(5/4) ,结果为 1.1180339887498949。
方差var():统计中的方差(样本方差)是每个样本值与全体样本值的平均数之差的平方值的平均数,即 mean((x - x.mean())** 2)。换句话说,标准差是方差的平方根。
In [101]: a = np.array([22,33,22,34,41,45]) np.amin(a) Out[101]: 22 In [102]: np.amax(a) Out[102]: 45 In [104]: np.ptp(a) Out[104]: 23 In [106]: a = np.array([1,2,3,4]) a.std() Out[106]: 1.118033988749895 In [107]: a.var() Out[107]: 1.25
矩阵相乘
numpy.dot(a, b, out=None)
a : ndarray 数组
b : ndarray 数组
第一个矩阵第一行的每个数字(2和1),各自乘以第二个矩阵第一列对应位置的数字(1和1),然后将乘积相加( 2 x 1 + 1 x 1),得到结果矩阵左上角的那个值3。也就是说,结果矩阵第m行与第n列交叉位置的那个值,等于第一个矩阵第m行与第二个矩阵第n列,对应位置的每个值的乘积之和。
a1 = np.array([[2,1],[4,3]]) a2 = np.array([[1,2],[1,0]]) np.dot(a1,a2) Out[108]: array([[3, 4], [7, 8]])
将外部的一张图片读取加载到numpy数组中
import matplotlib.pyplot as plt # 将图片数据进行读取,返回的是一个三维数组, 需安装pillow组件 img_arr = plt.imread('./hold.jpg') # 讲数组中的数据进行图像显示 plt.imshow(img_arr)
# 将数组中的每一个数组元素都减去100 plt.imshow(img_arr-100)
# 将图片进行左右翻转 plt.imshow(img_arr[:,::-1,:])
# 将图片上下翻转 plt.imshow(img_arr[::-1,:,:]) Out[15]: <matplotlib.image.AxesImage at 0x2056545a8b0>
# 将图片中“心”字裁剪出来 plt.imshow(img_arr[260:360,250:480,:]) # 裁剪时,第一个对应y轴,第二个对应x轴,
# 实现图片的九宫格 arr_3 = np.concatenate((img_arr,img_arr,img_arr),axis=1) # axis=1 表示行 arr_9 = np.concatenate((arr_3,arr_3,arr_3),axis=0) # axis=0 表示列 plt.imshow(arr_9)
参考:bilibili.com/video/BV1tE411F7do(P34~35)