写在前面
现在写论文做毕设大概要用到这个,所以今天就大概把numpy的基本用法过了一遍,跟着视频中的例子练习了一遍,感觉还是蛮实用的。但是有的步骤可能用起来还不是很熟练。所以写了笔记以防后面忘了可以速查,同时分享给一同想要学习的小伙伴儿们~
numpy
numpy中所有的运算都是基于数组array运行的
- import numpy as np
引入numpy的库并起一个别名np - np.array([1,2,3,4,5])
创建一个numpy的数组 - np.zeros((3,2))
创建一个三行2列的0矩阵 - a = np.zeros((3,2))
- a.shape
输出零矩阵的形状,即行列数 - np.ones((3,2))
创建3行2列全为1的矩阵 - np.arange(3,7)
创建一个有序的数组 - np.linspace(0,1,5)
创建一个等间距的数列,其中前两个参数代表数组范围,最后一个参数为元素个数
numpy中数组默认类型是64位的浮点数,但可以用dypte指定其他的数据类型
对于现有的数组,也可以利用astype()来转换数据类型
numpy中的两个相同长度的数组可以直接进行加减乘除的运算,就是对应位置的元素进行运算。
- np.dot(a,b)
即对两个向量进行点乘运算 - c@d
矩阵乘法,等同于np.matmul()函数 - np.sqrt(a)
对数组中的所有数求平方根 - np.sin(a)
对数组中的所有数求三角函数 - np.log(a)
对数组中的所有数进行对数运算 - np.power(a,2)
对数组中的所有数进行指数运算
numpy中不同尺寸的数组也可以直接做运算
在相加时,numpy会先将各自的数组进行扩展,即复制,然后将对应位置的元素进行相加
-
e.argmin()和e.argmax()
返回数组e中最小和最大元素的索引 -
e.sum()
返回数组中所有元素的总和 -
e.mean()
返回数组e中元素的平均值 -
np.median(a)
返回数组a中元素的中位数 -
e.var()
返回数组e的方差 -
e.std()
返回数组e的标准方差 -
g.sum(axis=0)
表示把数组g中每一列的数字相加,汇聚成一行
-
g.sum(axis=1)
表示把数组g中每一行的数字相加,汇聚成一列
对于numpy中array的操作,还有以下几种基本操作:
- 方括号中输入a<3则会返回所有小于3的元素
- 也可以写筛选条件,下面这个例子将筛选出大于3且是偶数的数
注:这里写筛选条件的时候,&表示且的意思,|表示或的意思
- 也可以对要提取的元素进行范围提取
注:Python中都是左闭右开区间,所以这里返回的是[1, 2]
- 也可以通过利用冒号来选中后续所有元素,或者可以直接省略掉冒号
- 也可以使用跨度来提取数组中的元素
例:使用numpy进行图像处理
通常我们可以把一张图看成是一个二维数组,数组中的每个元素用来表示像素点的亮度值
对于彩色的图片我们可以用三维数组来表示,数组中的第三维分别存储了像素点的红绿蓝分量
from PIL import Image
im = Image.open('D:\\研究生课程文件\\区块链相关资料\\pythonProject1\\testproject2\\door.jpeg')
im.show()
im = np.array(im)
im.shape
上述代码的意思就是先从PIL中导入Image这个类,然后打开图片door.jpeg,前面的参数是详细的文件路径,接着就是输出这张图片,然后把图片转换为array,然后输出数组的形状。
图片如下:
转换成数组输出后为:(800, 1200, 3),即转换成了一个800行1200列的三维数组。
- im_r = im[:,:,0]
- Image.fromarray(im_r).show()
使用这种方式可以单独提取出像素点的红色分量
此时输出的图片如下:
然后我试着执行以下步骤时,报错了~
原因是两张图片转化出来的行列不一致,没办法进行直接相加,而且这两种形状还不能进行广播,这里其实是可以通过resize()函数处理一下,让他们行列相等,就可以相加,后面就是这样进行了处理。
im2 = Image.open('D:\\研究生课程文件\\区块链相关资料\\pythonProject1\\testproject2\\wife.jpeg')
out = im2.resize((1200,800),Image.ANTIALIAS)
im3 = np.array(out)
im3.shape
im_blend1 = im * 0.4 + im3 * 0.6
im_blend1 = im_blend1.astype(np.uint8)
Image.formarray(im_blend1).show()
这里就是再打开图片wife.jpeg,然后利用resize函数对图片进行处理,然后再转化为array,这个时候它的array形状就和之前的door.jpeg是一样的了!
即输出数组为(800, 1200, 3),然后就可以相加了。
图片wife.jpeg如下:
然后将两张图片进行叠加以后如下:
也可以利用跨度对图片进行降采样
- im_downsample = im[::10, ::10,:]
利用跨度对图片进行降采样 - im_flipped = im[::-1,:,:]
- Image.fromarray(im_flipped).show()
对图片进行翻转并输出 - im_cropped = im[40:540,400:900,:]
- Image.fromarray(im_cropped).show()
对图片进行裁切并输出