python图像切面numpy_Python数据分析与展示Numpy、Matplotlib

Python 数据分析与展示

学习内容

Numpy数据表示、Matplotlib绘图、Pandas数据分析这三个库

Anaconda IDE的使用

conda、Spyder、IPython的使用

实例:图像的手绘风格、引力波的绘制、房价趋势分析、股市数据的分析

Anaconda IDE的使用

使用anaconda navigator 启动

anaconda来源于conda(用于管理python的第三方包与python环境)其包含了conda、Python与一批第三方的库

编程工具 Spyder 包含了IPython(交互式命令行)

IPython中的?可以得到变量信息与函数信息、%run命令可以运行python程序,在运行时会使用空的命令空间、%magic可以显示所有的魔术命令

212

image

![Uploading polar_331910.png . . .]

数据的表示Numpy

数据的维度:一组数据的组织形式

Numpy 一个开源的科学计算库,提供了一个强大的N维数组对象:ndarray,具有数学计算的功能

ndarray由实际的数据与描述数据的元数据两部分组成,一般要求数据的类型相同。

生成ndarray:

np.array([[],[]],dtype=np.float32),也可以使用元组进行创建

np.arrange(n) 类似range()函数

np.ones(shape)、np.zeros(shape)、np.full(shape,val)根据元组shape生成一个全1、全0、全val的ndarray数组

np.eye(n) 创建一个n维单位阵(以上均可以由dtype指定数据类型)

np.ones_like(a)、np.zeros_like(a)、np.full_like(a,val) 由a给定形状

np.linspace() 由起止数等间距地填充数据,形成数组,类似于range,但是给定的参数为start、end、number

np.concatenate() 将两个或多个数组合并成同一个数组

ndarray对象的属性:

属性

说明

.ndim

维度的数量

.shape

ndarray的尺度

.size

对象中元素的个数

.dtype

对象元素类型

.itemsize

每个元素的大小,以字节为单位

ndarray维度变换

.reshape(shape)不改变数组的元素,返回一个shape形状的新的数组

resize(shape) 修改原数组

swapaxes(ax1,ax2) 将数组的n个维度中的两个维度进行调换

flatten() 降维 不改变原数组

ndarray数组类型变换

new_a = a.astype(new_type)

ndarray转为列表

list = a.tolist()

ndarray数组操作(索引与切片)

一维数组的索引与python类似,切片a[1:4:2] 起始编号、终止编号(不含)、步长

多维数组的索引:a[1,2,3]从最外层到最内层

多维数组的切片:a[:,1:3,:],a[:,:,::2]

ndarray数组的运算

标量运算等价于对每一个元素进行运算

Numpy中的一元函数

np.abs(x)、np.fabs(x)、np.sqrt(x)、np.square(x)

np.log(x)、np.log10(x)

np.ceil(x)、np.floor(x)计算ceiling(不超过其的最大整数值)与floor(超过其最小整数值)

np.rint(x) 四舍五入值

np.modf(x) 以整数和小数两个数组返回

np.cosh(x) ···

np.exp(x)、np.sign(x)

···

Numpy中的二元函数

+-* / **

np.maximum(x,y)、np.minimum(x,y) 元素的最大、小值,生成新的数组

=、!=、>、= 比较大小返回布尔型数组

CSV文件(Comma-Separated Value,逗号分隔值)

文件单行以逗号进行分隔,常见数据库均可以读入或到处CSV文件

np.savetxt(fname,array,fmt='%.18e',delimiter=None)

fname 文件名称

array 要存入的数组

fmt 写入文件的格式,如%d %0.2

delimiter 分隔字符串,默认为空格

np.loadtxt(fname,dtype=np.float,delimiter=None,unpack=False)

fname 文件名称

dtype 数组元素格式

delimiter 分隔字符串,默认为空格

unpack 默认为False,读入数据存入一个变量

多维数组的存取

a.tofile(fid, sep="", format="%s")

fid : 文件名或者是打开的文件对象

sep : 数据分割字符串,空串则输出二进制文件

format : 输出格式

np.fromfile(file, dtype=float, count=-1, sep='')

count : int

Number of items to read. -1 means all items

np.save(file, array)/np.savez(file, array)

np.load(fname)

存为.npy或者.npz文件

Numpy随机函数子库np.random库

rand(d0,d1,...,dn)根据d0-dn创建随机数组,浮点数,[0,1),均匀分布

randn(d0,d1,...,dn) 正态分布

randint(low[,high,shape]) 随机整数

seed(s) 随机数种子

shuffle(a) 将第一轴进行重排列,改变数组

permutation(a) 由第一轴产生一个新的乱序数组,不改变数组

choice(a[,size,replace,pl]) 从一位数组a中以概率p抽取元素,形成size形状新数组,replace表示是否可以重用,默认True

uniform()、normal、poisson

Numpy的统计函数

.sum(a,axis = None) 给定轴的求和或所有求和

.mean(a,axis = None) 算数平均数

.average(a,axis = None,weights = None) 加权平均数

.std(a,axis = None) 标准差

.var(a,axis = None) 方差

.min(a) max(a)

argmin(a) argmax(a) 一维后的最小、大值的下标

unravel_index(index,shape) 根据shape将一维下标index转为多维下标

ptp(a) 极差

median(a) 中位数

gradient(a) 计算数组的梯度 连续值之间的变化率

实例:图像的手绘表示

图像一般采用RGB表示,三个通道取值都在0-255

Python中的PIL库(Python Image Library)

安装 pip install pillow

使用 from PIL import Image

图像在计算机中的表示为一个二元矩阵,每个矩阵元素为RGB值:(R,G,B) 每个通道为一个字节,那么一个矩阵元素的大小就是3个字节(24二进制位)

# 打开图像

im_array = np.array(Image.open('D:/test.jpg'))

# 保存到文件

im = Image.fromarray(im_array)

im.save(filename)

# 灰度变换

a = np.array(Image.open('D:/test.jpg').convert('L'))

手绘图片:黑白灰色,边界线条较重,相同或者相近的颜色趋向于白色,略有光源效果

# -*- coding: utf-8 -*-

"""

图像手绘风格实例代码

"""

from PIL import Image

import numpy as np

a = np.array(Image.open('D:/leiding.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_e1 = np.pi/2.2

vec_az = np.pi/4

dx = np.cos(vec_e1)*np.cos(vec_az)

dy = np.cos(vec_e1)*np.sin(vec_az)

dz = np.sin(vec_e1)

b = 255*(dx*uni_x+dy*uni_y+dz*uni_z)

b = b.clip(0,255)

im = Image.fromarray(b.astype('uint8'))

im.save('D:/handpaint.jpg')

Matplotlib库

使用方法:

import matplotlib.pyplot as plt

plt.plot([3,1,4,5,2])

plt.ylabel('grade')

plt.show()

# 存为文件

plt.savefig('test',dpi = 600) #默认输出为PNG 文件

97a8dcdc7470

plt运行结果.png

同样也可以这样绘制:

plt.plot([0,2,4,6,8],[3,1,4,5,2])

# 给出横纵坐标的范围 横-1到10,纵0到6

plt.axis([-1,10,0,6])

# 绘图区域分割

plt.subPlot(nrows,ncols,plot_number) # 与matlab一样,标号从左到右,从上到下

# 也可以将逗号去掉,比如plt.subplot(324)

plt.plot(x,y,format_string,**kwargs)

x: X轴数据,列表或者数组,可选,可组合使用

y: Y轴数据,列表或者数组

format_stirng: 控制输出字符串,可选

'b'/'g'/'#008000'/'0.8' 颜色控制字符

'-' 实线 '--' 破折线 '-.' 点划线 ':' 虚线 '''' 无线条 曲线风格字符

'.' 点标记 ',' 像素标记 'o' 实心圈标记 'v' 倒三角标记 '^' 上三角标记 ...... 标记字符

**kwargs: 第二组或者更多组的(x,y,format_string)

plt中的文本显示函数

plt.xlabel()、plt.ylabel() 对轴加上标签

plt.title() 增加文件头

plt.text() 任意位置增加文本

plt.text(2,1,'str') 前两个参数表示text出现范围

plt.annotate() 增加带箭头的注释文本

plt.grid() 显示网格线

plt.subplot2grid(GridSpec,CurSpec,colspan=1,rowspan=1)

设定网格,选中网格,设计成不同大小的绘图子区域

GridSpec 元组,表示将区域分成什么样子的子区域

CurSpec 元组,表示子区域的起始格子坐标

colspan、rowspan 表示子区域占用列、行数

同样,此函数可以使用如下库实现:

import matplotlib.gridspec as grs

gs = grs.GridSpec(3,3)

ax1 = plt.subplot(gs[0:])

ax2 = plt.subplot(gs[1,:-1])

pyplot基础图标函数

plot()函数、箱形图函数boxplot()、条形图函数bar()、横向条形图函数barh()、极坐标图函数polar()、饼图pie()

功率谱密度图函数psd()、谱图specgram()、X-Y相关性图cohere()、散点图scatter()、直方图hist()、步阶图step()、等值图contour()、垂直图vlines()、柴火图stem()、数据日期plot_date()

下面以代码说明:

# -*- coding: utf-8 -*-

"""

Created on Tue Aug 1 14:07:25 2017

@author: Administrator

"""

import matplotlib.pyplot as plt

# 饼图的标签

labels = 'Frogs','Hogs','Dogs','Logs'

# 饼图对应的尺寸,即所占比例

sizes = [15,30,45,10]

# 突出与突出的量

explode = (0,0.1,0,0)

# autopct显示百分数的方式、shadow阴影效果、startangele起始角度

plt.pie(sizes,explode=explode,labels=labels,autopct = '%1.1f%%',shadow = False,startangle = 90)

# 使得轴的度量成为一样

plt.axis('equal')

plt.show()

97a8dcdc7470

pie.png

# -*- coding: utf-8 -*-

"""

Created on Tue Aug 1 15:39:08 2017

@author: Administrator

"""

# 绘制直方图

import matplotlib.pyplot as plt

import numpy as np

np.random.seed(0)

mu,sigma = 100,20 #均值与标准差

a = np.random.normal(mu,sigma,size=100) # 正态分布

# a 给定数组 bin 表示直方的个数,就是取值区间的划分,纵轴表示为频次/区间长度

# normed = 0 显示频次,normed=1 显示频次/区间长度

# histtype 绘制类型 facecolor 绘制颜色

plt.hist(a,20,normed = 1,histtype = 'stepfilled',facecolor = 'b',alpha = 0.75)

plt.title('Histgram')

plt.savefig('D:/Histgram',dpi = 150)

plt.show()

97a8dcdc7470

Histgram.png

# -*- coding: utf-8 -*-

"""

Created on Tue Aug 1 15:48:07 2017

@author: Administrator

"""

# 极坐标图的绘制

import matplotlib.pyplot as plt

import numpy as np

# 极坐标图中的数据个数

N = 20

# 等分出20个不同的角度 0-360度

theta = np.linspace(0.0,2*np.pi,N,endpoint = False)

# 生成每个角度对应的值

radii = 10*np.random.rand(N)

# 生成宽度值

width = np.pi/4*np.random.rand(N)

# 获得绘制极坐标图的子区域

ax = plt.subplot(111,projection = 'polar')

# 前三个参数对应 theta 从何地开始绘制 radii 从中心点绘制出来的长度,width 指绘图区域的面积

bars = ax.bar(theta,radii,width=width,bottom=0.0)

for r,bar in zip(radii,bars):

bar.set_facecolor(plt.cm.viridis(r/10.))

bar.set_alpha(0.5)

plt.savefig('D:/polar',dpi = 150)

plt.show()

97a8dcdc7470

polar.png

# -*- coding: utf-8 -*-

"""

Created on Tue Aug 1 16:02:32 2017

@author: Administrator

"""

import numpy as np

import matplotlib.pyplot as plt

fig,ax = plt.subplots()

ax.plot(10*np.random.randn(100),10*np.random.randn(100),'o')

ax.set_title('Simple Scatter')

plt.savefig('D:/Scatter',dpi = 150)

plt.show()

97a8dcdc7470

Scatter.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值