本文的主要内容是根据MOOC中嵩天老师的Python数据分析与展示课程进行总结的,可供读者学习和复习numpy的基础知识点。
MOOC中嵩天老师的课程链接:https://www.icourse163.org/learn/BIT-1001870002?tid=1206192225#/learn/announce
目录
一、NumPy数组的创建与变换
1. 数组的创建
可以通过以下几种方法创建数组
(1)从Python中的列表、元组等类型中创建ndarray数组;eg. a = np.array([1,2,3])或者a = np.array((1,2,3));
import numpy as np
a = np.array([1,2,3])
b = np.array((1,2,3))
(2)使用Numpy中函数创建ndarray
常用函数:
函数中shape的地方需要用元组表示,实例:
import numpy as np
a = np.arange(10) #生成0-9的数组
b = np.ones((3,4)) #生成3×4的全1数组
c = np.zeros((3,4)) #生成3×4的全0数组
d = np.full((2,3),6) #生成2×3的全是6的数组
e = np.eye(5) #生成单位矩阵
(3)生成等间隔数组和合并数组:
a = np.linspace(start,stop,N, endpoint=True)
作用:在起点和终点的区间范围内生成N个数据,因为endpoint=True,所以生成的数组包含最后一个点(默认包含);
temp = np.concatenate((a,b,c,...),axis=n)
作用:将a,b,c在第n个维度上进行合并,除了合并的维度可以不同,其他的维度必须相同才能进行合并,否则报错。
import numpy as np
a = np.linspace(0,10,6,endpoint=True) #生成[0,2,4,6,8,10]
b = np.linspace(0,20,6)
temp = np.concatenate((a,b),axis=0)
(4)以某一数组为蓝本生成新数组:
import numpy as np
a = np.random.rand(3,4) #生成3×4的随机数组
a1 = np.ones_like(a) #生成与a具有相同维度的全1数组
a2 = np.zeros_like(a) #生成与a具有相同维度的全1数组
a3 = np.full_like(a,val) #生成与a具有相同维度的值全为val的数组
2. NumPy的属性
import numpy as np
array = np.array([[1,2,3],[2,3,4]])
print(array)
print('number of dim:', array.ndim)
print('shape:',array.shape)
print('size:',array.size)
3. 数组的变换
数组元素类型的变换:a.astype(dtype)
eg. a = a.astype(int),可以将数组a的数据类型变为整形;
数组变换到列表:list = a.tolist()
4. 数组的索引和切片
索引:维度的索引从0开始,a[0,1,3]表示索引数组a中由第1维第一层、第2维第二层和第3维第四层所确定的数据;
切片:a = np.arange(10), 则a[2:5]表示[2,3,4]; a[2:8:3]表示[2,5]; a[::2]表示[0,2,4,6,8];
5. 数组的运算和运算函数
二、NumPy的文件读取和保存
1. CSV文件(用逗号分隔)
写入:np.savetxt(frame, array, fmt='%.18e', delimiter=None)
frame:文件、字符串或产生器,可以是.gz或.bz2的压缩文件;
array:存入文件的数组;
fmt:写入文件的格式,例如:%d %.2f %.18e
delimiter:分割字符串,默认是任何空格,如果是CSV文件,则‘,’;
它可以生成任意带有分割符的文件;
eg: np.savetxt('a.csv', a, fmt = '%d', delimiter = ','); 输出整形
np.savetxt('a.csv', a, fmt = '%.1f', delimiter = ','); 输出带1位小数
读取:np.loadtxt(frame, dtype=np.float, delimiter=None, unpack=False)
frame:需要读取的文件,可以是压缩文件;
dtype:需要将文件的数据转化为特定格式,由dtype指定;
delimiter:分割字符串,默认是任何空格,对于CSV文件是',';
unpack:如果True,读入属性将分别写入不同变量;
np.savetxt和np.loadtxt只能存取一维或二维的数据;
2. 多维数据的存取
写入:a.tofile(frame,sep=' ', format='%d');
读取:np.fromfile(frame, dtype=float, count=-1,sep='');
frame:文件、字符串;
dtype:读取的数据类型;
count:读入元素个数,-1表示读入整个文件;
sep:数据分割字符串,如果空串,用二进制读入;
这种读取方法要知道dtype和dim;那怎么办呢,新建一个文件说明;
3. Numpy的便捷文件存取
写入:np.save(fname,array)或np.savez(fname,array)
读取:np.load(fname)
fname:文件名,以.npy为扩展名,压缩扩展名为.npz;
array:数组变量
三、NumPy随机、统计、梯度函数的介绍
1. Numpy的随机函数
随机函数1
np.random.rand(d0,d1,...,dn):产生n维的随机数组,每个元素的值在[0,1)之间均匀分布;
np.random.randn(d0,d1,...,dn):产生n维的随机数组,每个元素值为标准正态分布;
np.random.randint(low,high,shape):生成一个shape形状的在low和high之间随机整数数组;
np.random.seed(s):随机数种子,s是给定的种子值;在使用上述随机函数前使用种子值,可以产生种子值对应的随机数;种子值相同的随机数是相同的。
随机函数2
np.random.shuffle(a): 对a的第一维进行随机排列,改变a;
np.random.permutation(a):产生第一轴乱序的新数组,不改变a本身;
np.random.choice(a,size,replace,p):从一维数组a中以概率p抽取元素,形成size形状新数组,replace表示是否可以重用元素,默认为True;p是和a同尺寸的概率矩阵;
eg: np.random.choice(a.flatten(),(6,8))
随机函数3
np.random.uniform(low,high,shape): 产生具有均匀分布的数组;
np.random.normal(loc,scale,shape): 产生具有正态分布的数据,loc均值,scale标准差,shape形状;
np.random.poission(lam,size): 产生具有泊松分布的数组,lam随机事件发生率,size形状;
2. Numpy的统计函数
NumPy直接提供的统计类函数,如np.std(), np.var(), np.average();
np.sum(a,axis=None): 根据给定轴axis计算数组a相关元素之和,axis等于整数或元组;
np.mean(a,axis=None): 同理,计算平均值;
np.average(a,axis=None,weights=None): 可求加权平均值;
np.std(a,axis=None):计算标准差;
np.var(a,axis=None):计算方差;
np.min(a),np.max(a):计算a中元素的最小值、最大值;
np.argmin(a),np.argmax(a):计算数组中a中元素最小最大值的降一维后下标;
np.unravel_index(index,shape):根据shape将一维下标index转换成多维下标;
np.ptp(a): 计算数组a中元素最大值与最小值的差;
np.median(a): 计算数组a中元素的中位数(中值);
3. NumPy的梯度函数
np.gradient(f): 计算数组f中元素的梯度,当f为多维时,返回每个维度梯度;
梯度:连续值之间的变化率,即斜率;
四、图像的手绘效果
1. 图像的数组表示
我们平时常见的图像很适合用数组表示;灰度图像就是二维数组,彩色图像是三维图像(在二维的基础上每个元素变为3个);这里使用PIL库(Python Image Library)辅助处理图像,PIL库是一个具有强大图像处理能力的第三方库,常用于处理图像。
引用:from PIL import Image
I = np.array(Image.open('1.jpg')), I就是一个保存着图片数据的数组;
I.shape为(x,y,3); I.dtype为uint8
2. 图像的变换
图像是数组,对数组的操作即可改变图像;
I = np.array(Image.open('1.jpg').convert('L')) 生成灰度图像;
实现图像反转代码:
import numpy as np
from PIL import Image
I = np.array(Image.open('1.jpg').convert('L'))
print(I.shape,I.dtype)
b = 255-I #如果是三维的彩色数据,则为[255,255,255]-I
im = Image.fromarray(b.astype('uint8'))
im.save('3.jpg')
3. 图像的显示
①对于图像类型的变量,直接运行变量本身就能在命令行中显示图像(本人在Spyder中运行的);
②使用im.show('filename')可以打开一个窗口显示图像,窗口标题是输入的'filename' ;
③另外一种是数组的可视化,图像的可视化推荐使用matplotlib.pyplot中imshow()函数,使用方法如下:
import matplotlib.pyplot as plt
I = np.random.randint(0,255,(200,200)).astype(np.uint8) #产生随机图像
plt.imshow(I,cmap='gray') #以灰度显示,默认会是伪彩色
结果: