一维数据
一维数据由对等关系的有序或无序数据构成,采用线性方式组织,对应列表、数组和集合等概念
如:3.1413, 3.1398, 3.1404, 3.1401, 3.1349, 3.1376。
二维数据
二维数据由多个一维数据构成,是一维数据的组合形式,表格是典型的二维数据,其中,表头是二维数据的一部分。
多维数据
多维数据由一维或二维数据在新维度上扩展形成
高维数据
高维数据仅利用最基本的二元关系展示数据间的复杂结构
NumPy是一个开源的Python科学计算基础库,包含:
• 一个强大的N维数组对象 ndarray
• 广播功能函数
• 整合C/C++/Fortran代码的工具
• 线性代数、傅里叶变换、随机数生成等功能
NumPy是SciPy、 Pandas等数据处理或科学计算库的基础
我们一般使用 import numpy as np
来引用numpy库
ndarray 意为:N维数组对象
这里自然就有一个疑问:Python已有列表类型,为什么需要一个数组对象(类型)?看下面的例子:
那么,引入ndarray 的好处就是:
• 数组对象可以去掉元素间运算所需的循环,使一维向量更像单个数据
• 设置专门的数组对象,经过优化,可以提升这类应用的运算速度
注:科学计算中,一个维度所有数据的类型往往相同
• 数组对象采用相同的数据类型,有助于节省运算和存储空间
ndarray由两部分构成:
• 实际的数据
• 描述这些数据的元数据(数据维度、数据类型等)
ndarray数组一般要求所有元素类型相同(同质),数组下标从0开始
疑问:ndarray为什么要支持这么多种元素类型?
对比:Python语法仅支持整数、浮点数和复数3种类型
• 科学计算涉及数据较多,对存储和性能都有较高要求
• 对元素类型精细定义,有助于NumPy合理使用存储空间并优化性能
• 对元素类型精细定义,有助于程序员对程序规模有合理评估
非同质的ndarray对象
ndarray数组的创建方法
• 从Python中的列表、元组等类型创建ndarray数组
• 使用NumPy中函数创建ndarray数组,如:arange, ones, zeros等
• 从字节流(raw bytes)中创建ndarray数组
• 从文件中读取特定格式,创建ndarray数组
(1) 从Python中的列表、元组等类型创建ndarray数组
(2)使用NumPy中函数创建ndarray数组,如:arange, ones, zeros等
(3)使用NumPy中其他函数创建ndarray数组
函数用法:
对于创建后的ndarray数组,可以对其进行维度变换和元素类型变换
维度变换:
注意:这里有些函数调用后会修改原数组,有些则不会。
元素类型变换:
ndarray数组向列表的转换
数组的索引和切片
索引:获取数组中特定位置元素的过程
切片:获取数组元素子集的过程
一维数组的索引和切片:与Python的列表类似
多维数组的索引:
多维数组的切片
NumPy一元函数:对ndarray中的数据执行元素级运算的函数
CSV (Comma‐Separated Value, 逗号分隔值),CSV是一种常见的文件格式,用来存储批量数据
loadtxt: 读CSV文件
注:dtype一般默认为 浮点 类型
CSV文件的局限性
CSV只能有效存储一维和二维数组
np.savetxt() np.loadtxt()只能有效存取一维和二维数组
注意:该方法需要读取时知道存入文件时数组的维度和元素类型,a.tofile()和np.fromfile()需要配合使用,可以通过元数据文件来存储额外信息
NumPy的随机函数子库:np.random.* 包含有关随机数的函数
注意函数是否改变原数组
注:argmax/argmin经常与unravel_index结合使用—->得到多维数组中最大/小数据的多维数组下标
图像一般使用RGB色彩模式,即每个像素点的颜色由红(R)、绿(G)、蓝(B)组成。
RGB三个颜色通道的变化和叠加得到各种颜色,其中
• R 红色,取值范围,0‐255
• G 绿色,取值范围,0‐255
• B 蓝色,取值范围,0‐255
RGB形成的颜色包括了人类视力所能感知的所有颜色
注:图像是一个三维数组,维度分别是高度、宽度和像素RGB值
变换原理:读入图像后,获得像素RGB值,修改后保存为新的文件
代码:
#HandDrawPic.py
# -*- coding: utf-8 -*-
from PIL import Image
import numpy as np
a = np.asarray(Image.open('./beijing.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.)#这里相当于 grad_z=1.0
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)#为避免数据越界,将生成的灰度值裁剪至0‐255区间
im = Image.fromarray(b.astype('uint8')) #重构图像
im.save('./beijingHD.jpg')
代码分析:
原理:利用像素之间的梯度值和虚拟深度值对图像进行重构,根据灰度变化来模拟人类视觉的远近程度。