Python 数据分析与展示

1
import numpy as np

Numpy库入门

数组对象:ndarry (np.array)

ndarray对象的属性

属性 说明
.ndim 秩,即轴的数量或维度的数量
.shape 尺度,对于矩阵(n,m)
.size 元素个数,n*m
.dtype 元素类型
.itemsize 元素大小(字节)

ndarray数组的元素类型

数据类型 说明
bool
intc 同c的int,为int32/int64
intp 用于索引的整数,同c中的ssize_t,为int32/int64
int8 [-128,127]
int16 [-32768,32767]
int32 [-2312^{31},2312^{31}-1]
int64 [-2632^{63},2632^{63}-1]
uint8 [0,255]
uint16 [0,65535]
uint32 [0,2322^{32}-1]
uint64 [0,2642^{64}-1]
float16 16位半精度浮点数:1位符号位,5位指数,10位尾数
float32 32位半精度浮点数:1位符号位,8位指数,23位尾数
float64 64位半精度浮点数:1位符号位,11位指数,52位尾数
complex64 复数,实部和虚部都是32位浮点数
complex128 复数,实部和虚部都是64位浮点数

浮点数:()10(符号)尾数*10^{指数}
复数:实部(.real)+j虚部(.imag)

数据应同质

ndarray数组的创建方法

  • 从Python中的列表、元组等类型创建ndarray数组x = np.array(list/tuple)
  • 使用NumPy中函数创建ndarray数组
函数 说明
np.arrange(n) 同range()
np.ones(shape) 全是1
np.zeros(shape) 全是0
np.full(shape,val) 全是val
np.eye(n) 单位矩阵
np.ones_like(a) 像a一样全是1
np.zeros_like(a) 像a一样全是0
np.full_like(a,val) 像a一样全是val
  • 使用NumPy中其他函数创建ndarray数组
函数 说明
np.linspace() 根据起止数据等间隔填充
np.concatenate() 合并多个数组
1
2
np.linspace(1,10,4)
np.linspace(1,10,4,endpoint=False)
1
2
array([ 1.,  4.,  7., 10.])
array([1. , 3.25, 5.5 , 7.75])

ndarray数组变换

  • 元素类型变换
1
2
new_a=a.astype(new_type) 
ls=a.tolist()#装换为列表
  • 维度变换
函数 说明
.reshape(shape) 不改变原数组
.resize(shape) 改变原数组
.swapaxes(ax1,ax2) 调换两个维度
.flatten() 降为一维

数组的操作

  • 数组的索引
    a[-1,1,2]
  • 数组的切片
    a[:,1:3,:]

ndarray数组的运算

image.png

数据存储与展示

数据的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只能有效存储一维和二维数组
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 : 数据分割字符串,如果是空串,写入文件为二进制

该方法需要读取时知道存入文件时数组的维度和元素类型,a.tofile()和np.fromfile()需要配合使用,可以通过元数据文件来存储额外信息。

NumPy的便捷文件存取

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

NumPy函数

  • NumPy的随机数函数:np.random.*

image.png

  • NumPy的统计函数:np.*

image.png

  • NumPy的梯度函数:
    np.gradient(f)计算数组f中元素的梯度,当f为多维时,返回每个维度梯度

实例1 图像的手绘效果(PIL库)

pip install pillow
from PIL import Imagine

1
im = np.array(Image.open("example.jpg"))

图像是一个三维数组,维度分别是高度、宽度和像素RGB值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from PIL import Image
import numpy as np

a = np.asarray(Image.open('./fcity.jpg').convert('L')).astype('float')

depth = 10. # (0-100)
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('./fcityHD.jpg')

Matplotlib库入门

import matplotlib.pyplot as plt

plt.plot(x, y, format_string, **kwargs)
∙ x : X轴数据,列表或数组,可选
∙ y : Y轴数据,列表或数组
∙ format_string: 控制曲线的格式字符串,可选,由颜色字符、风格字符和标记字符组成
∙ **kwargs : 第二组或更多(x,y,format_string)
当绘制多条曲线时,各条曲线的x不能省略

plt.savefig()将输出图形存储为文件,默认PNG格式,可以通过dpi修改输出质量

plt.subplot(3,2,4)及plt.subplot(324)在全局绘图区域中创建一个分区体系,并定位到一个子绘图区域

image.png

文本显示:

more_1
more_2
应用

-------------end-------------