NumPy(Numerical Python)是python语言的一个扩展程序库,支持大量维度数组与矩阵运算,此外,也针对数据运算提供大量的数学函数库。
NumPy是高性能科学计算和数据分析的基础
NumPy的主要功能:
-
ndarray,一个多维数组结构,高效且节省空间
-
无需循环对整组数据进行快速运算的数学函数
-
*读写磁盘数据的工具以及用于操作内存映射文件的工具
-
*线性代数、随机数生成和傅里叶变换功能
-
*用于集成C、C++等代码的工具
Numpy的安装
pip install numpy
ndarray-多维数组创建
ndarry是多维数组结构,与列表区别:
-
数组对象内的元素类型必须相同
-
数组大小不可修改
np.array()创建
import numpy as np np.array() # 创建一维数组 np.array([1,2,3,4,5]) # array([1, 2, 3, 4, 5]) # 创建二维数组 np.array([[1,2,3],[4,5,6]]) # array([[1, 2, 3], [4, 5, 6]])
注意:
-
numpy默认ndarray的所有元素的类型是相同的
-
如果传进列表中包含不同的类型,会统一为一个类型,优先级:str>float>int
np.array([[1,2.2,3],[4,5,6]]) # 整数都会变成浮点数 # array([[1. , 2.2, 3. ], [4. , 5. , 6. ]])
np的routines函数创建
-
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None) 等差数量数组
np.linspace(1,100,num=20) # 产生1-100之间数量20个的等差数组
-
np.arange([start, ]stop, [step, ]dtype=None) 等差步长数组
np.arange(0,100,step=2) # 产生0-100,步长为2的等差数组
-
random.randint(low,high=None,size=None,dtype="1")
np.random.randint(0,100,size=(4,5)) # size表示维度 # array([[83, 58, 4, 20, 35], [13, 33, 30, 14, 79], [86, 58, 33, 44, 63], [43, 40, 55, 16, 13]]) # 固定随机数组的随机因子,每次产生固定不变数组 np.random.seed(10) # 随机因子/时间种子 np.random.randint(0,100,size=(4,5))
ndarray属性和方法
常用属性
-
T:数组的转置(对高维数组而言)
-
dtype:数组元素的数据类型
-
size:数组元素的个数
-
ndim:数组的维数
-
shape:数组的维度大小(以元组形式)
img_arr = plt.imread('./girl.jpg') # 打开一张图片,获取图片的矩阵数组 # 获取数组的维度 img_arr.ndim # 3 # 获取数组的外形 img_arr.shape # (676, 1202, 3) # 获取数组的大小 img_arr.size # 2437656 # 获取数组的数据类型 img_arr.dtype # dtype('uint8')
常用方法
numpy.zeros(dim1,dim2) 创建dim1*dim2的零矩阵 numpy.arange numpy.eye(n) /numpy.identity(n) 创建n*n单位矩阵 numpy.array([…data…], dtype=float64 ) array.astype(numpy.float64) 更换矩阵的数据形式 array.astype(float) 更换矩阵的数据形式 array * array 矩阵点乘 array[a:b] 切片 array.copy() 得到ndarray的副本,而不是视图 array [a] [b]=array [ a, b ] 两者等价 name=np.array(['bob','joe','will']) res=name==’bob’ res= array([ True, False, False], dtype=bool) data[True,False,…..] 索引,只索取为True的部分,去掉False部分 通过布尔型索引选取数组中的数据,将总是创建数据的副本。 data[ [4,3,0,6] ] 索引,将第4,3,0,6行摘取出来,组成新数组 data[-1]=data[data.__len__()-1] numpy.reshape(a,b) 将a*b的一维数组排列为a*b的形式 array([a,b,c,d],[d,e,f,g]) 返回一维数组,分别为[a,d],[b,e],[c,f],[d,g] array[ [a,b,c,d] ][:,[e,f,g,h] ]=array[ numpy.ix_( [a,b,c,d],[e,f,g,h] ) ] array.T array的转置 numpy.random.randn(a,b) 生成a*b的随机数组 numpy.dot(matrix_1,matrix_2) 矩阵乘法 array.transpose( (1,0,2,etc.) ) 对于高维数组,转置需要一个由轴编号组成的元组
ndarray索引和切片、变形
1、数组和标量之间的运算 a+1 a*3 1//a a**0.5 2、同样大小数组之间的运算 a+b a/b a**b 3、数组的索引: 一维数组:a[5] 多维数组: 列表式写法:a[2][3] 新式写法:a[2,3] (推荐) 数组的切片: 一维数组:a[5:8] a[4:] a[2:10] = 1 多维数组:a[1:2, 3:4] a[:,3:5] a[:,1] 4、强调:与列表不同,数组切片时并不会自动复制,在切片数组上的修改会影响原数组。 【解决方法:copy()】
索引
一维数组的索引和列表一致,多维同理
无法直接索引某一列
arr = np.random.randint(0,100,size=(5,7)) arr[1] # 获取索引为1的行 arr[[1,2]] # 获取索引1,2的行 arr[1,2] # 获取行索引为1,列索引为2的值
切片
一维数组的切片和列表相同,多维同理
# 获取二维数组前两行 arr[0:2] # 默认切片为行索引 # 获取二维数组前两行和前两列 arr[0:2,0:2]
数据反转
# 将数组的行反转 arr[::-1] # 将数组的列反转 arr[:,::-1] # 全部反转 arr[::-1,::-1]
变形
ndarray数组可以使用arr.reshape()函数,注意参数是一个tuple
多维数组和一维数组之间的转换
arr = np.random.randint(0,100,size=(4,6)) arr.shape # 二维变一维 arr_1 = arr.reshape(24) arr_2 = arr.reshape((1,24)) # 一维变多维 arr_3 = arr_1.reshape((3,8)) arr_4 = arr_1.reshape arr_5 = arr_1.reshape((4,-1)) # -1表示自动计算 # 多维转多维 arr_6 = arr.reshape((3,8))
注意:
-
在变形的过程中,数组的维度乘积必须是一致的,如4*6 可以变形为2*12,也可以变为8*3,1*24
级联
np.concatenate()
对多个numpy数组进行横向或者纵向的拼接
1.一维、二维、多维数组的级联,实际操作中级联为二维数组
np.concatenate((arr,arr),axis=0) # axis代表轴向,0表示咧,1表示行
2.合并照片
# 利用我们刚才打开的照片数组 arr_3 = np.concatenate((img_arr,img_arr,img_arr),axis=1) # 水平拼接三个数组 arr_9 = np.concatenate((arr_3,arr_3,arr_3),axis=0) # 垂直拼接上面拼接的图片 plt.imshow(arr_9) # 最终展示为9宫格的图片
ndarray布尔类型索引
问题:给一个数组,选出数组中所有大于5的数。
-
答案:a[a>5] 原理: a>5会对a中的每一个元素进行判断,返回一个布尔数组 布尔型索引:将同样大小的布尔数组传进索引,会返回一个由所有True对应位置的元素的数组
问题2:给一个数组,选出数组中所有大于5的偶数。
问题3:给一个数组,选出数组中所有大于5的数和偶数。
-
答案: a[(a>5) & (a%20)] a[(a>5) | (a%20)]
import numpy as np a = np.array([1,2,3,4,5,4,7,8,9,10]) a[a>5&(a%2==0)] # 注意加括号,不叫括号错误,如下 # array([ 1, 2, 3, 4, 5, 4, 7, 8, 9, 10]) a[(a>5)&(a%2==0)] # array([ 8, 10])
ndarray聚合函数
-
numpy.sum():求和函数
-
numpy.max()/min():最大值/最小值
-
numpy.mean():平均值
-
cumsum:求前缀和
-
std:求标准差
-
var:求方差
-
argmin:求最小值索引
-
argmax:求最大值索引
arr.sum(axis=1) # 列向求和 arr.max(axis=1) # 列向最大值 arr.mean(axis=1) # 列向平均值
其他聚合函数
-
Function Name NaN-safe Version Description
-
np.sum np.nansum Compute sum of elements
-
np.prod np.nanprod Compute product of elements
-
np.mean np.nanmean Compute mean of elements
-
np.std np.nanstd Compute standard deviation
-
np.var np.nanvar Compute variance
-
np.min np.nanmin Find minimum value
-
np.max np.nanmax Find maximum value
-
np.argmin np.nanargmin Find index of minimum value
-
np.argmax np.nanargmax Find index of maximum value
-
np.median np.nanmedian Compute median of elements
-
np.percentile np.nanpercentile Compute rank-based statistics of elements
-
np.any N/A Evaluate whether any elements are true
-
np.all N/A Evaluate whether all elements are true
-
np.power 幂运算
ndarray排序
numpy.sort()和ndarray.sort()都可以排序,稍有区别
numpy.sort(arr,axis=0) # 返回一个新的排序好的对象,arr并没有改变 arr.sort(axis=0) # arr直接被改变了