关于Python中numpy的基本使用详解以及速查

写在前面

现在写论文做毕设大概要用到这个,所以今天就大概把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)
    创建一个等间距的数列,其中前两个参数代表数组范围,最后一个参数为元素个数

图片1
图片2

numpy中数组默认类型是64位的浮点数,但可以用dypte指定其他的数据类型

图片3

对于现有的数组,也可以利用astype()来转换数据类型
numpy中的两个相同长度的数组可以直接进行加减乘除的运算,就是对应位置的元素进行运算。
  • np.dot(a,b)
    即对两个向量进行点乘运算
  • c@d
    矩阵乘法,等同于np.matmul()函数
  • np.sqrt(a)
    对数组中的所有数求平方根
  • np.sin(a)
    对数组中的所有数求三角函数
  • np.log(a)
    对数组中的所有数进行对数运算
  • np.power(a,2)
    对数组中的所有数进行指数运算

图片4

numpy中不同尺寸的数组也可以直接做运算
在相加时,numpy会先将各自的数组进行扩展,即复制,然后将对应位置的元素进行相加

图片5

图片6
图片7

  • 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中每一列的数字相加,汇聚成一行
    图片10

  • g.sum(axis=1)
    表示把数组g中每一行的数字相加,汇聚成一列
    图片11

图片8

图片9

对于numpy中array的操作,还有以下几种基本操作:
  • 方括号中输入a<3则会返回所有小于3的元素
    图12
  • 也可以写筛选条件,下面这个例子将筛选出大于3且是偶数的数
    图13
注:这里写筛选条件的时候,&表示且的意思,|表示或的意思
  • 也可以对要提取的元素进行范围提取
    图片14
注:Python中都是左闭右开区间,所以这里返回的是[1, 2]
  • 也可以通过利用冒号来选中后续所有元素,或者可以直接省略掉冒号
    图片15
  • 也可以使用跨度来提取数组中的元素
    图片16

例:使用numpy进行图像处理

通常我们可以把一张图看成是一个二维数组,数组中的每个元素用来表示像素点的亮度值

图片17

对于彩色的图片我们可以用三维数组来表示,数组中的第三维分别存储了像素点的红绿蓝分量

图片18

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,然后输出数组的形状。
图片如下:

图片19

转换成数组输出后为:(800, 1200, 3),即转换成了一个800行1200列的三维数组。
  • im_r = im[:,:,0]
  • Image.fromarray(im_r).show()
使用这种方式可以单独提取出像素点的红色分量
此时输出的图片如下:

图片20

然后我试着执行以下步骤时,报错了~

图片21

原因是两张图片转化出来的行列不一致,没办法进行直接相加,而且这两种形状还不能进行广播,这里其实是可以通过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如下:

图片22

然后将两张图片进行叠加以后如下:

图片23

也可以利用跨度对图片进行降采样
  • 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()
    对图片进行裁切并输出

总结

numpy提高Python的计算速度,是通过将问题向量化和并行化的思路来实现的。这种思想在其他的技术中也有应用,比如CUDA,Shader编程和深度学习中也会用到。

图片24

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

loveCC_orange

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值