前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python---numpy的初步认识

Python---numpy的初步认识

作者头像
用户7886150
修改2021-01-05 10:25:48
9730
修改2021-01-05 10:25:48
举报
文章被收录于专栏:bit哲学院bit哲学院

参考链接: 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数据分析与展示》,推荐刚入门的同学去学习,这是非常好的入门视频。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档