mooc课程-北京理工大学
嵩天 教授
课程地址:https://www.icourse163.org/course/BIT-1001870002
数据分析前奏
anaconda下载和使用
数据分析之表示
导学
数据的维度
一维数据、二维数据、多维数据、高维数据
一维数据:列表和集合
二维和多维数据:列表类型
高维数据:字典类型或数据表示格式
json、xml、yaml
Numpy入门
Numpy是一个开源的python科学计算基础库
- 一个强大的N维数组对象 ndarray
- 广播功能函数
- 整合c/c++/Fortran 代码的工具
- 线性代数、傅里叶变化、随机数生成等过程
numpy 的引用
N维数组对象:ndarray
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]**3)
print(c)
这里如果使用
c=a**2+b**3
会报错
TypeError: unsupported operand type(s) for ** or pow(): 'list' and 'int'
如果使用numpy
import numpy as np
a=np.array([0,1,2,3,4])
b=np.array([9,8,7,6,5])
c=a**2+b**3
print(c)
数组对象可以去掉元素间运算所需的循环,使一维向量更像单个数据。
设置专门的数组对象,经过优化,可以提升这类应用的运算速度。(底层是c)
#ndim-秩
#shape-对象的尺寸
#size-对象元素的个数
#dtype-对象的元素类型
#itemsize-对象每个元素大小
a=np.array([[0,1,2,3,4],
[9,8,7,6,5]])
#ndim-秩
print(a.ndim)
#shape-对象的尺寸
print(a.shape)
#size-对象元素的个数
print(a.size)
#dtype-对象的元素类型
print(a.dtype)
#itemsize-对象每个元素大小
print(a.itemsize)
ndarray数组的创建方法
1)从python中的列表、元祖等类型创建ndarray数组
#np.arange(n) 类似range()函数,返回ndarray类型,元素0到n-1
print(np.arange(6))
#np.ones(shape) 根据shape生成一个全1数组 默认是浮点数类型
print(np.ones((3,4)))
#np.zeros(shape) 根据shape生成一个全1数组
print(np.zeros((3,5),dtype=np.int32))
#np.full(shape,val) 根据shape生成一个数组,每个元素都是val
#np.eye(n) 创建正方的n*n单位矩阵,对角线为1,其余为0
print(np.eye(4))
print(np.linspace(1,10,4))
print(np.linspace(1,10,4,endpoint=False))
ndarray数组向列表转换
ls=a.tolist()
写入数据
a=np.arange(100).reshape(5,20)
np.savetxt('a.csv',a,fmt='%d',delimiter=',')
读数据
b=np.loadtxt('a.csv',delimiter=',')
print(b)
CSV文件的局限性
csv只能有效存储一维和二维数组
np.savetxt() np.loadtxt()只能有效存取一维和二维数组
多维数组的存取
a=np.arange(100).reshape(5,10,2)
a.tofile("b.dat",sep=",",format='%d')
如果不指定分割符会生成二进制文件
打开后会看不懂
a=np.arange(100).reshape(5,10,2)
a.tofile("b.dat",sep=",",format='%d')
c=np.fromfile("b.dat",dtype=np.int,sep=",")
print(c)
c=np.fromfile("b.dat",dtype=np.int,sep=",").reshape(5,10,2)
print(c)
系统写入文件后,维度信息丢失,需要知道原来的维度信息
a=np.arange(100).reshape(5,10,2)
np.save("a.npy",a)
b=np.load("a.npy")
print(b)
存储时有保存格式和数据类型
。
a1=np.random.rand(2,3,4)
print(a1)
a2=np.random.randn(2,3,4)#正太分布
print(a2)
a3=np.random.randint(10,20,(2,3))#10到20之间2*3维度
print(a3)
梯度函数在处理声音和图像边缘的时候可以帮助我们发现声音和图像的边缘
from PIL import Image
import numpy as np
im=np.array(Image.open("timg.jpg"))
print(im.shape,im.dtype)
输出结果为图像的高度,宽度,RGB
图像的变换
from PIL import Image
import numpy as np
a=np.array(Image.open("timg.jpg"))
print(im.shape,im.dtype)
#图形的变换
b=[255,255,255]-a
im=Image.fromarray(b.astype('uint8'))#重构图像
im.save("t2.jpg")
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.)
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('./beijingHD.jpg')