《Python 数据分析与展示》数据分析之表示

mac2024-05-29  138

Numpy 库入门

数据的维度

一维数据:列表(数据类型可以不同)、数组(数据类型相同) 二维数据:表格是典型的二维数据 多维数据:由一维或二维数据在新维度上扩展形成 高维数据:利用最基本的二元关系展示数据间的复杂结构(字典、JSON、XML和YAML格式)

{ "firstName":'Tian', "lastName":'Song', "address":{ "streetAddr":"中关村南大街5号" "city":"北京市""zipcode":"100081" }, "prof":['Computer System',"Security"] }

Numpy 的数组对象(nparray)

def Sum(): a = [0,1,2,3,4] b = [9,8,7,6,5] c = [] for i in range(len(a)): c.append(a[i]**2+b[i]**2) return c print(Sum()) import numpy as np def Sum(): a = np.array([0,1,2,3,4]) b = np.array([9,8,7,6,5]) c = a**2+b**2 return c print(Sum()) 数组对象可以去掉元素间运算所需的循环,使一维向量更像单个数据设置专门的数组对象,经过优化,可以提升这类应用的运算速度数组对象采用相同的数据类型,有助于节省运算和存储时间
ndarray 对象的属性
属性说明.ndim秩,即轴的数量或维度的数量.shapendarray对象的尺度,对于矩阵,n行m列.sizendarray对象的个数,相当于.shape中 n ∗ m n*m nm的值.dtypendarray对象的的烈性.itemsizendarray对象中每个元素的大小,以字节为单位
ndarray 数组的创建方法
以列表、元祖或混合类型创建 np.array(list/tuple,dtype = np.float32) x = np.array([0,1,2,3,4]) x = np.array((0,1,2,3,4)) x = np.array([[1,2],[9,7],(3,4)) 使用Numpy中函数创建ndarray数组 函数说明np.arange(n)类似range()函数,返回nparray类型,元素从0到n-1np.ones(shape)根据shape生成一个全1数组,shape是元祖类型np.zeros(shape)根据shape生成一个全0数组,shape是元祖类型np.full(shape,val)根据shape生成一个数组,每个元素都是valnp.eye(n)创建一个正方的 n ∗ n n*n nn单位矩阵,对角线为1,其余为0np.ones_likes(a)根据数组a的形状生成一个全1数组np.zeros_likes(a)据数组a形状生成一个全0数组np.full_like(a,val)根据数组a形状生成数组,每个元素值都是val 使用Numpy中其他函数创建ndarray数组 函数说明np.linspace()根据起止数据等间距地填充数据,形成数组np.concatenate()将两个或多个数组合并成一个新的数组 import numpy as np a = np.linspace(1,10,4) b = np.linspace(1, 10, 4, endpoint = False) c = np.concatenate((a,b)) print(c)
ndarray 数组的变换
数组的维度变换 方法说明.reshape(shape)不改变数组元素,返回一个shape形状的数组,原数组不变.resize(shape)与.reshape()功能一直,但修改原数组.swapaxes(ax1,ax2)将数组n个维度中两个维度进行调换.flatten()对数组进行降维,返回折叠后的一维数组,原数组不变 数组的类型变换 new = a.astype(new_type)

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对应元素> < >= <= == !=算数比较,产生布尔型数组

Numpy数据存取与函数

CSV 文件的存取 np.savetxt(frame,array,fmt = "%.18e",delimiter = None) # 参数 frame:文件、字符串或产生器,可以是.gz或.bz2的压缩文件 array:存入文件的数组 fmt:写入文件的格式,例如 :%d %.2f %.18e delimiter:分割字符串,默认是任何空格 np.loadtxt(frame,dtype = np.float, delimiter = None, unpack = False) # 参数 frame: 文件、字符串或产生器,可以是.gz或.bz2的压缩文件 dtype: 数据类型,可选 delimiter:分割字符串,默认是任何空格 unpack: 如果True,读入属性将分别写入不同变量

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形成的颜色包括了人类实例所能感知的所有颜色。

图形的变化

from PIL import Image import numpy as np im = np.array(Image.open("C:/Users/Administrator/Desktop/1723875_1409556793I3Eg.jpg")) # print(im.shape,im.dtype) # (600, 800, 3) uint8 b = [255,255,255] - im im = Image.fromarray(b.astype("uint8")) im.save("C:/Users/Administrator/Desktop/1.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 im = Image.fromarray(b.astype("uint8")) im.save("C:/Users/Administrator/Desktop/2.jpg")

在数字图像处理中,针对不同的图像格式有其特定的处理算法。所以,在做图像处理之前,我们需要考虑清楚自己要基于哪种格式的图像进行算法设计及其实现。本文基于这个需求,使用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")

“图像手绘效果实例”原理分析

最新回复(0)