Python---numpy的初步认识

2021-01-05 10:25:48 浏览数 (1)

参考链接: Python中的numpy.isfinite

什么是numpy? 

NumPy是Python科学计算的基础包。  (它提供了多维数组对象、基于数组的各种派生对象(例如,masked Array, 矩阵)。除此之外,还提供了各种各样的加快数组操作的例程,包括数学基本计算、逻辑、图形操作、排序、选择、输入输出,离散傅立叶变换、基础线性代数、基础统计操作、随机仿真等等。) 

NumPy的核心是ndarray对象。一方面,Ndarray对象封装了可以包含相同数据类型的多维数组;另一方面,为获得更好的性能, 在ndarray上的操作都是在编译过的代码上执行的。此外,和Python自身的序列对象相比,两者之间有如下不同: 

NumPy数组的大小是固定的。Python的List是可以动态增长的。改变NumPy的大小会重新创建一个新的数组并把原来的删掉。NumPy数组中的元素一定是同一类型的。(相应地,每个元素所占的内存大小也是一样的。)例外情况是:(不是特别理解:one can have arrays of (Python, including NumPy) objects, thereby allowing for arrays of different sized elements.)NumPy数组支持在大量数据上进行数学计算和其他类型的操作。通常情况下,与Python自带的序列类型相比,NumPy数组上的操作执行更高效,代码量也更少。越来越多的Python科学计算包都是用到了NumPy的数组;虽然这些库支持Python序列类型的输入,但是内部操作还是要先将其转换为NumPy的数组类型,而且输出通常就是NumPy数组。所以,如果你想要高效地使用这些Python的科学计算包,仅仅知道Python内建的序列类型是不够的,你还需要知道如何使用NumPy数组。 

numpy怎么使用? 

导入使用包:import numpy as np创建ndarray.  直接创建: 

arr = np.array([1,3,4,5])

arr = np.array([

                [1,2,3,4],

                [5,6,7,8]

                ]) 

**通过函数方式创建**:参考下文的函数使用

numpy的常用函数有哪些? 

ndarray(数组)基础属性函数(axis=0表述列, axis=1表述行)  .ndim:数组的维度值  .shape:数组的维度的尺度(简单说就是数组的形状)。例如:(2,3,5)  .size:数组中所有元素的个数总和(一共都有多少个元素)  .dtype:数组中元素的类型(每个数组里面的类型是一样的)。例如:int32  .itemsize:数组中每个元素的大小(以字节为单为,每个元素占4个字节)ndarray(数组)的创建  注意:函数的相关参数,可以参考pycharm中函数参数的说明  np.array(list):将列表转换为ndarray  np.arange(n):创建多少到多少,步幅为多少的随机值的ndarray。  np.ones(shape):生成一个指定形状的,值全为1的ndarray。(shape是一个形状定义的元组:(3,2),下面的函数中shape都是这样的)  np.zeros(shape):生成一个指定形状的,值全为0的ndarray。  np.empty(shap):生成一个指定形状的数组,值为一些无效的垃圾数据  np.full(shape,val):生成一个指定形状,指定值的ndarray。  np.eye(n):生成行数等于列数的对角矩阵  np.ones_like(a):按数组a的形状生成全1的数组  np.zeros_like(a): 同理  np.full_like (a, val) : 同理  np.linspace(1,10,4, endpoint = False): 根据起止数据等间距地生成数组 ,endpoint 表示10是否作为生成的元素(等差数组)  np.logspace(0,9,10):等比数组  np.concatenate((ndarray1,ndarray2),axis=0):将两个ndarray组合起来 

注意:linspace 和 logspace默认都是闭合区间取值,第三个参数是元素个数  arange是前闭后开取值,第三个参数是步长 

数组的维度的转换  arr.shape = (x,y) 强制转换形状,改变原数组  arr.reshape(shape):不改变当前数组,按shape生成一个新的形状数组(与原数组共享内存)返回  np.swapaxes(arr,ax1,ax2):件两个维度进行调换  arr.flatten():对数据进行降维,返回折叠后的-维数组  arr.reshape(-1):也是降维  注意:维度转换简单理解就是数组中每个元素都有定位的x,y,z标识,维度转换,就是类似:y,x,z形式生成一个新的x,y,z数组  降维可以理解为,从左到右,按照每行的执行顺序将数据依次放入新的数组中数组的类型转变  数据类型的转换:arr.dtype=np.float32 指定当前数组的数据类型  arr2 = arr.astype(float) ,根据当前数组,创建一个指定类型的新数组  数组向列表的转换:a.tolist()数组的索引和切片  一维数组切片  a = np.array([9,8,7,6,5,4])  a[1:4:2]==>array([8,6]) [起始编号:终止编号(不含):步长]  多维数组切片 

arr = np.arange(12).reshape((3, 4)) 

arr[i, :] #取第i行数据

arr[i:j, :] #取第i行到第j行的数据    

arr[:,0] # 取第0列的数据,以行的形式返回的

arr[:,:1] # 取第0列的数据,以列的形式返回的

# 取第一维的索引1到索引2之间的元素,也就是第二行 

# 取第二维的索引1到索引3之间的元素,也就是第二列和第三列

arr[1:2, 1:3] 

# 取第一维的全部 

# 按步长为2取第二维的索引0到末尾之间的元素,也就是第一列和第三列

arr[:, ::2] 

简单的理解就是逗号(,)是维区隔符,多个逗号就多了一个维,冒号(:)是切片方式,一组最多两个冒号(开始:结束(不包含):步长)  例如一个3维的数组要切片  arr[开始:结束(不包含):步长 , 开始:结束(不包含):步长, 开始:结束(不包含):步长 ]  最后一维的切片没冒号,就是行显示,有冒号就是列显示了 

普通索引数组  布尔索引数组:  names = np.array([u’张三’,u’张四’,u’张五’])  scores = np.array([  [85,86,87,88],  [95,96,97,98],  [55,56,57,58]  ])  classs = np.array([u’语文’,u’数学’,u’物理’,u’化学’])  scores[names == u’张四’].reshape(-1)[classs == u’物理’][0] 

花式索引数组:arr[np.ix_([0,3,5],[0,3,2])] 

数组的运算  函数形式运算  一元函数  np.abs(a) np.fabs(a) : 取各元素的绝对值  np.sqrt(a) : 计算各元素的平方根  np.square(a): 计算各元素的平方  np.log(a) np.log10(a) np.log2(a) : 计算各元素的自然对数、10、2为底的对数  np.ceil(a) np.floor(a) : 计算各元素的ceiling 值, floor值(ceiling向上取整,floor向下取整)  np.rint(a) : 各元素 四舍五入  np.modf(a) : 将数组各元素的小数和整数部分以两个独立数组形式返回  np.exp(a) : 计算各元素的指数值  np.sign(a) : 计算各元素的符号值 1( ),0,-1(-)  np.modf(a):将数组中元素的小数为和整数位以两部分独立数组的形式返回  np.isnan(a):返回一个表示“哪些值是NaN(不是一个数字)”的布尔类型数组  np.isfinite(a), np.isinf(a) : 分别表示“哪些元素是有穷的(非inf,非NaN)”或者“哪些元素是无穷的“的布尔类型数组  np.cos(arr),np.cosh(arr)  np.sin(arr), np.sinh(arr)  np.tan(arr),np.tanh(arr)  普通以及双曲型三角函数  np.arccos(arr), np.arccosh(arr)  np.arcsin(arr), np.arcsinh(arr)  np.arctan(arr), np.arctanh(arr)  反三角函数 

二元函数  np.mod(arr1,arr2) 元素级的取模  np.dot(arr1,arr2) 求两个数组的点积(矩阵积)  np.greater(arr1,arr2): (arr1 >arr2)  np.less(arr1,arr2) : (arr1 < arr2)  np.equal(arr1,arr2): (arr1 == arr2)  np.less_equal(arr1, arr2):(arr1 <= arr2)  np.greater_equal(arr1,arr2):(arr1 

arr = np.array([

[1,2,np.NaN,4],

[4,5,6,np.NaN],

[7,8,9,np.inf],

[np.inf,np.e,np.pi,4]

])

condition = np.isnan(arr) | np.isinf(arr)

print(np.where(condition, 0, arr))

# 满足条件的值用第二个参数替换 

**数据的去重(去重重复值)**

“`  arr2 = np.unique(arr) #返回由单一值构成的从小到大的一维数组 

自己的矢量运算  a b  a-b  a*b  a/b  a%b  a//b  b可也是数字,也可以是nbarray(但是必须和a一样的形状) 

/************************* 华丽的分割线 **********************************/ 

数据的CSV文件存取  CSV (Comma-Separated Value,逗号分隔值) 只能存储一维和二维数组 

np.savetxt(frame, array, fmt=’% .18e’, delimiter = None): frame是文件、字符串等,可以是.gz .bz2的压缩文件; array 表示存入的数组; fmt 表示元素的格式 eg: %d % .2f % .18e ; delimiter: 分割字符串,默认是空格  eg: np.savetxt(‘a.csv’, a, fmt=%d, delimiter = ‘,’ ) 

np.loadtxt(frame, dtype=np.float, delimiter = None, unpack = False) : frame是文件、字符串等,可以是.gz .bz2的压缩文件; dtype:数据类型,读取的数据以此类型存储; delimiter: 分割字符串,默认是空格; unpack: 如果为True, 读入属性将分别写入不同变量。  多维数据的存取  a.tofile(frame, sep=’’, format=’%s’ ) : frame: 文件、字符串; sep: 数据分割字符串,如果是空串,写入文件为二进制 ; format:: 写入数据的格式  eg: a = np.arange(100).reshape(5, 10, 2)  a.tofile(“b.dat”, sep=”,”, format=’%d’) 

np.fromfile(frame, dtype = float, count=-1, sep=’’): frame: 文件、字符串 ; dtype: 读取的数据以此类型存储; count:读入元素个数, -1表示读入整个文件; sep: 数据分割字符串,如果是空串,写入文件为二进制 

PS: a.tofile() 和np.fromfile()要配合使用,要知道数据的类型和维度。 

np.save(frame, array) : frame: 文件名,以.npy为扩展名,压缩扩展名为.npz ; array为数组变量  np.load(fname) : frame: 文件名,以.npy为扩展名,压缩扩展名为 

np.save() 和np.load() 使用时,不用自己考虑数据类型和维度。 

numpy随机数函数  numpy 的random子库 

rand(d0, d1, …,dn) : 各元素是[0, 1)的浮点数,服从均匀分布  randn(d0, d1, …,dn):标准正态分布  randint(low, high,( shape)): 依shape创建随机整数或整数数组,范围是[ low, high)  seed(s) : 随机数种子 

shuffle(a) : 根据数组a的第一轴进行随机排列,改变数组a  permutation(a) : 根据数组a的第一轴进行随机排列, 但是不改变原数组,将生成新数组  choice(a[, size, replace, p]) : 从一维数组a中以概率p抽取元素, 形成size形状新数组,replace表示是否可以重用元素,默认为False。  eg:  replace = False时,选取过的元素将不会再选取 

uniform(low, high, size) : 产生均匀分布的数组,起始值为low,high为结束值,size为形状  normal(loc, scale, size) : 产生正态分布的数组, loc为均值,scale为标准差,size为形状  poisson(lam, size) : 产生泊松分布的数组, lam随机事件发生概率,size为形状  eg: a = np.random.uniform(0, 10, (3, 4)) a = np.random.normal(10, 5, (3, 4)) 

numpy的统计函数  sum(a, axis = None) : 依给定轴axis计算数组a相关元素之和,axis为整数或者元组  mean(a, axis = None) : 同理,计算平均值  average(a, axis =None, weights=None) : 依给定轴axis计算数组a相关元素的加权平均值  std(a, axis = None) :同理,计算标准差  var(a, axis = None): 计算方差  eg: np.mean(a, axis =1) : 对数组a的第二维度的数据进行求平均  a = np.arange(15).reshape(3, 5)  np.average(a, axis =0, weights =[10, 5, 1]) : 对a第一各维度加权求平均,weights中为权重,注意要和a的第一维匹配 

min(a) max(a) : 计算数组a的最小值和最大值  argmin(a) argmax(a) : 计算数组a的最小、最大值的下标(注:是一维的下标)  unravel_index(index, shape) : 根据shape将一维下标index转成多维下标  ptp(a) : 计算数组a最大值和最小值的差  median(a) : 计算数组a中元素的中位数(中值)  eg:a = [[15, 14, 13],  [12, 11, 10] ]  np.argmax(a) –> 0  np.unravel_index( np.argmax(a), a.shape) –> (0,0) 

numpy的梯度函数  np.gradient(a) : 计算数组a中元素的梯度,f为多维时,返回每个维度的梯度  离散梯度: xy坐标轴连续三个x轴坐标对应的y轴值:a, b, c 其中b的梯度是(c-a)/2  而c的梯度是: (c-b)/1 

当为二维数组时,np.gradient(a) 得出两个数组,第一个数组对应最外层维度的梯度,第二个数组对应第二层维度的梯度。  

图像的表示和变换  PIL, python image library 库  from PIL import Image  Image是PIL库中代表一个图像的类(对象) 

im = np.array(Image.open(“.jpg”)) 

im = Image.fromarray(b.astype(‘uint8’)) # 生成  im.save(“路径.jpg”) # 保存 

im = np.array(Image.open(“.jpg”).convert(‘L’)) # convert(‘L’)表示转为灰度图 

PS:本博文摘抄自中国慕课大学上的课程《Python数据分析与展示》,推荐刚入门的同学去学习,这是非常好的入门视频。

0 人点赞