一维数据:列表(数据类型可以不同)、数组(数据类型相同) 二维数据:表格是典型的二维数据 多维数据:由一维或二维数据在新维度上扩展形成 高维数据:利用最基本的二元关系展示数据间的复杂结构(字典、JSON、XML和YAML格式)
{ "firstName":'Tian', "lastName":'Song', "address":{ "streetAddr":"中关村南大街5号" "city":"北京市", "zipcode":"100081" }, "prof":['Computer System',"Security"] }astype()方法一定会创建新的数组(原始数据的一个拷贝),即使两个类型一致
数组向列表的转换 ls = a.tolist() 数组的操作(索引和切片)数组执行元素级运算的函数 一元函数 函数说明np.abs(x),np.fabs(x)计算数组各元素的绝对值np.sqrt(x)计算数组各元素的平方根np.square(x)计算数组各元素的平方np.log(x) np.log10(x) np.log2(x)计算数组各元素的自然对数、10底对数和2底对数np.ceil(x) np.flool(x)计算数组各元素的ceiling值或floor值np.rint(x)计算各元素四舍五入值np.modf(x)将数组各元素的小数和整数部分以两个独立数组形式返回np.cos(x) np.cosh(x) np.sin(x) np.sinh(x) np.tan(x) np.tanh(x)计算数组各元素的普通型和双曲型三角函数np.exp(x)计算数组各元素的指数值np.sign(x)计算数组各元素的符号值,1(+),0,-1(-)-二元函数
函数说明+ - * / **两个数组各元素进行相对应运算np.maximum(x,y) np.fmax() np.minimum(x,y) np.fmin()元素级的最大值/最小值计算np.mod(x,y)元素级的模运算np.copysign(x,y)将数组y中各元素值的符号赋值给数组x对应元素> < >= <= == !=算数比较,产生布尔型数组CSV文件的局限性:CSV只能有效的存储一维和二维数组 np.savetxt() np.loadtxt() 只能有效的存储一维和二维数组
多维数据的存取 a.tofile(frame,sep="",format = "%s") # 参数 frame: 文件、字符串 sep: 数据分割字符串,如果是空串,写入文件为二进制 format:写入数据格式 np.fromfile(frame,dtype = float,count = -1,sep = "") # 参数 frame: 文件、字符串 dtype: 读取的数据类型 count: 读入元素个数,-1表示读入整个文件 sep: 数据分隔字符串,如果是空串,写入文件为二进制注:该方法需要读取是知道存入文件时数组的维度和元素类型
便捷的文件存取 np.save(frame,array)或np.savez(frame,array) # 参数 frame: 文件名,以.npy为扩展名,压缩扩展名为.npz array: 数组变量 np.load(frame) # 参数 frame: 文件名,以.npy为扩展名,压缩扩展名为.npz Numpy 中随机数函数库 np.random的随机数函数 函数说明rand(d0,d1,…,dn)根据d0-dn创建随机数数组,浮点数,[0,1),均匀分布randn(d0,d1,…,dn)根据d0-dn创建随机数数组,标准正态分布randint(low[,high,shape])根据shape创建随机整数或者整数数组,范围是[low,high)seed(s)随机数种子,s是给定的种子值 np.random的随机数函数 函数说明shuffle(a)根据数组a的第1轴进行随机排雷,改变数组apermutation(a)根据数组a的第1轴产生一个新的乱序数组,不改变数组achoice(a[,size,replace,p])从一维数组a中以概率p抽取元素,形成size形状新数组replace表示是否可以重用元素,默认为False np.random的随机数函数 函数说明uniform(low,high,size)产生具有均匀分布的数组,low起始值,high结束值,size形状normal(loc,scale,size)产生具有正态分布的数组,loc均值,scale标准差,size形状poisson(lam,size)产生具有泊松分布的数组,lam随机事件发生率,size形状 Numpy的统计函数 1.Numpy的统计函数 函数说明sum(a,axis=None)根据给定轴axis计算数组a相关元素之和,axis整数或元祖mean(a,axis=None)根据给定轴axis计算数组a相关元素的期望,axis整数或元祖average(a,axis=None,weight=None)根据给定轴axis计算数组a相关元素的加权平均值std(a,axis=None)根据给定轴axis计算数组a相关元素的标准差var(a,axis=None)根据给定轴axis计算数组a相关元素的方差2.Numpy的统计函数
函数说明min(a) max(a)计算数组a中元素的最小值、最大值argmin(a) argmax(a)计算数组a中元素最小值、最大值将一位后下标unravel_index(index,shape)根据shape将一维下标index转换为多维下标ptp(a)计算数组a中元素最大值与最小值的差median(a)计算数组a中元素的中位数(中值) import numpy as np b = np.arange(15,0,-1).reshape(3,5) print(b) # [[15 14 13 12 11] # [10 9 8 7 6] # [ 5 4 3 2 1]] print(np.argmax(b)) # 0 print(np.unravel_index(np.argmax(b),b.shape)) # (0, 0) Numpy的梯度函数 函数说明np.gradient(f)计算数组f中元素的梯度,当f为多维时,返回每个维度梯度 import numpy as np a = np.random.randint(1,20,(5)) print(a) # [10 15 15 1 3] print(np.gradient(a)) # [ 5. 2.5 -7. -6. 2. ] import numpy as np a = np.random.randint(1,50,(3,5)) print(a) print(np.gradient(a))输出结果为:
[[12 11 10 24 45] [12 3 3 1 46] [41 22 5 41 24]] [array([[ 0. , -8. , -7. , -23. , 1. ], # 最外层的梯度值 [ 14.5, 5.5, -2.5, 8.5, -10.5], [ 29. , 19. , 2. , 40. , -22. ]]), array([[ -1. , -1. , 6.5, 17.5, 21. ], # 第二层的梯度值 [ -9. , -4.5, -1. , 21.5, 45. ], [-19. , -18. , 9.5, 9.5, -17. ]])]图像一般使用RGB色彩模式,即每个像素点的颜色有红(R),绿(G)、蓝(B)组成,三种颜色通道的变化和叠加得到各种颜色,取值范围均为0-255,RGB形成的颜色包括了人类实例所能感知的所有颜色。
在数字图像处理中,针对不同的图像格式有其特定的处理算法。所以,在做图像处理之前,我们需要考虑清楚自己要基于哪种格式的图像进行算法设计及其实现。本文基于这个需求,使用python中的图像处理库PIL来实现不同图像格式的转换。 PIL的九种不同模式:1,L,P,RGB,RGBA,CMYK,YCbCr,I,F
模式“L” 为灰色图像,它的每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度。在PIL中,从模式“RGB”转换为“L”模式是按照下面的公式转换的: L = R * 299/1000 + G * 587/1000+ B * 114/1000 from PIL import Image import numpy as np im = np.array(Image.open("C:/Users/Administrator/Desktop/1723875_1409556793I3Eg.jpg").convert("L")) b = (100/255)*im + 150 # 区间转换 im = Image.fromarray(b.astype("uint8")) im.save("C:/Users/Administrator/Desktop/3.jpg") from PIL import Image import numpy as np im = np.array(Image.open("C:/Users/Administrator/Desktop/1723875_1409556793I3Eg.jpg").convert("L")) b = 255*(im/255)**2 # 像素平方 im = Image.fromarray(b.astype("uint8")) im.save("C:/Users/Administrator/Desktop/2.jpg")手绘效果的几个特征:
黑白灰色边界线条较重相同或相近色彩趋于白色略有光源效果 from PIL import Image import numpy as np a = np.asarray(Image.open("C:/Users/Administrator/Desktop/1723875_1409556793I3Eg.jpg").convert("L")).astype('float') depth = 10 grad = np.gradient(a) # 取图像灰度的梯度值 grad_x,grad_y = grad # 分别取横纵图像梯度值 grad_x = grad_x*depth/100 grad_y = grad_y*depth/100 A = np.sqrt(grad_x**2 + grad_y**2 +1.) uni_x = grad_x/A uni_y = grad_y/A uni_z = 1./A vec_el = np.pi/2.2 # 光源的俯视角度,弧度值 vec_az = np.pi/4 # 光源的方位角度,弧度值 dx = np.cos(vec_el)*np.cos(vec_az) # 光源对x轴的影响 dy = np.cos(vec_el)*np.sin(vec_az) # 光源对y轴的影响 dz = np.sin(vec_el) # 光源对z轴的影响 b = 255*(dx*uni_x + dy*uni_y + dz*uni_z) # 光源归一化 b = b.clip(0,255) im = Image.fromarray(b.astype("uint8")) # 重构图像 im.save("C:/Users/Administrator/Desktop/2.jpg")