我为什么要用NumPy?
- 对于同样的数值计算任务,使用NumPy要比直接编写Python代码便捷得多;
- NumPy中的数组的存储效率和输入输出性能均远远优于Python中等价的基本数据结构,且其能够提升的性能是与数组中的元素成比例的;
- NumPy的大部分代码都是用C语言写的,其底层算法在设计时就有着优异的性能,这使得NumPy比纯Python代码高效得多
- 当然,NumPy也有其不足之处,由于NumPy使用内存映射文件以达到最优的数据读写性能,而内存的大小限制了其对TB级大文件的处理;此外,NumPy数组的通用性不及Python提供的list容器。因此,在科学计算之外的领域,NumPy的优势也就不那么明显。
关于Python Numpy矩阵的用法总结请参考博文:https://www.cnblogs.com/wj-1314/p/10244807.html
什么是NumPy?(基础篇)
NumPy是一个功能强大的Python库,主要用于对多维数组执行计算。NumPy这个词来源于两个单词– Numerical 和Python 。NumPy提供了大量的库函数和操作,可以帮助程序员轻松地进行数值计算。这类数值计算广泛用于以下任务:
机器学习模型:在编写机器学习算法时,需要对矩阵进行各种数值计算。例如矩阵乘法、换位、加法等。NumPy提供了一个非常好的库,用于简单(在编写代码方面)和快速(在速度方面)计算。NumPy数组用于存储训练数据和机器学习模型的参数。
图像处理和计算机图形学:计算机中的图像表示为多维数字数组。NumPy成为同样情况下最自然的选择。实际上,NumPy提供了一些优秀的库函数来快速处理图像。例如,镜像图像、按特定角度旋转图像等。
数学任务:NumPy对于执行各种数学任务非常有用,如数值积分、微分、内插、外推等。因此,当涉及到数学任务时,它形成了一种基于Python的MATLAB的快速替代。
NumPy的安装
在你的计算机上安装NumPy的最快也是最简单的方法是在shell上使用以下命令:pip install numpy
。
这将在你的计算机上安装最新/最稳定的NumPy版本。通过PIP安装是安装任何Python软件包的最简单方法。现在让我们来谈谈NumPy中最重要的概念,NumPy数组。
Numpy的使用以及应用
导入Numpy模块
使用np.array()创建
使用plt 创建
使用np的routines函数创建
使用array()创建一个一维数组
import numpy as np arr = np.array([1,2,3]) arr
|
array([1, 2, 3])
arr = np.array([[1,2,3],[4,5,6]]) arr
|
array([[1, 2, 3],
[4, 5, 6]])
arr = np.array([1,2.2,"three"]) arr
|
array(['1', '2.2', 'three'], dtype='<U32')
- 将外部的一张图片读取加载到numpy数组中,然后尝试改变数组元素的数值查看对原始图片的影响
import matplotlib.pyplot as plt img_arr = plt.imread("C:\\Users\\图片.jpg") plt.imshow(img_arr)
|
<matplotlib.image.AxesImage at 0x2204a526cd0>
img_arr = img_arr - 100 plt.imshow(img_arr)
|
<matplotlib.image.AxesImage at 0x2204d86c690>
- zero()
- ones()
- linespace()
- arange()
- random系列
array([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])
np.linspace(0,100,num=20)
|
array([ 0. , 5.26315789, 10.52631579, 15.78947368,
21.05263158, 26.31578947, 31.57894737, 36.84210526,
42.10526316, 47.36842105, 52.63157895, 57.89473684,
63.15789474, 68.42105263, 73.68421053, 78.94736842,
84.21052632, 89.47368421, 94.73684211, 100. ])
array([10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42,
44, 46, 48])
np.random.randint(0,100,size=(5,3))
|
array([[93, 62, 92],
[13, 20, 45],
[ 7, 65, 87],
[98, 23, 74],
[69, 18, 37]])
numpy的常用属性
arr = np.random.randint(0,100,size=(5,6)) arr
|
array([[78, 21, 12, 74, 84, 52],
[84, 57, 31, 61, 42, 10],
[60, 52, 95, 45, 19, 35],
[18, 31, 23, 21, 66, 21],
[89, 40, 84, 5, 47, 13]])
(5, 6)
2
30
dtype('int32')
numpy.ndarray
arr = np.array([1,2,3]) arr.dtype
|
dtype('int32')
arr = np.array([1,2,3],dtype="int64") arr.dtype
|
dtype('int64')
dtype('uint8')
numpy的索引和切片操作(重点)
arr = np.random.randint(1,100,size=(5,6)) arr
|
array([[94, 45, 2, 65, 25, 61],
[11, 45, 70, 66, 94, 85],
[32, 14, 90, 27, 32, 73],
[34, 32, 47, 74, 81, 69],
[42, 90, 73, 51, 20, 56]])
array([11, 45, 70, 66, 94, 85])
array([[11, 45, 70, 66, 94, 85],
[34, 32, 47, 74, 81, 69],
[42, 90, 73, 51, 20, 56]])
- 切片操作
- 切出前两行数据
- 切出前两列数据
- 切出前两行的前两列数据
- 数组数据翻转
- 练习:将一张图片上下左右进行翻转操作
- 练习:将图片进行指定区域的裁剪
array([[94, 45, 2, 65, 25, 61],
[11, 45, 70, 66, 94, 85]])
array([[94, 45],
[11, 45],
[32, 14],
[34, 32],
[42, 90]])
array([[94, 45],
[11, 45]])
array([[42, 90, 73, 51, 20, 56],
[34, 32, 47, 74, 81, 69],
[32, 14, 90, 27, 32, 73],
[11, 45, 70, 66, 94, 85],
[94, 45, 2, 65, 25, 61]])
array([[61, 25, 65, 2, 45, 94],
[85, 94, 66, 70, 45, 11],
[73, 32, 27, 90, 14, 32],
[69, 81, 74, 47, 32, 34],
[56, 20, 51, 73, 90, 42]])
array([[56, 20, 51, 73, 90, 42],
[69, 81, 74, 47, 32, 34],
[73, 32, 27, 90, 14, 32],
[85, 94, 66, 70, 45, 11],
[61, 25, 65, 2, 45, 94]])
img_arr = plt.imread("C:\\Users\\图片.jpg") plt.imshow(img_arr)
|
<matplotlib.image.AxesImage at 0x2204d7a3690>
(1024, 1024, 3)
plt.imshow(img_arr[:,::-1,:])
|
<matplotlib.image.AxesImage at 0x2204f886690>
plt.imshow(img_arr[::-1,:,:])
|
<matplotlib.image.AxesImage at 0x2204f629a90>
plt.imshow(img_arr[200:1000,250:800,:])
|
<matplotlib.image.AxesImage at 0x2204fdc81d0>
变形reshape
array([[94, 45, 2, 65, 25, 61],
[11, 45, 70, 66, 94, 85],
[32, 14, 90, 27, 32, 73],
[34, 32, 47, 74, 81, 69],
[42, 90, 73, 51, 20, 56]])
arr_1 = arr.reshape((30,))
|
array([[94, 45, 2, 65, 25],
[61, 11, 45, 70, 66],
[94, 85, 32, 14, 90],
[27, 32, 73, 34, 32],
[47, 74, 81, 69, 42],
[90, 73, 51, 20, 56]])
级联操作
- axis轴向的理解(将多个numpy数组进行横向或者纵向的拼接)
- 问题:
- 级联的两个数组维度一样,但是行列个数不一样会如何?(不行,链接的两个数组维度必须完全匹配)
np.concatenate((arr,arr),axis=1)
|
array([[94, 45, 2, 65, 25, 61, 94, 45, 2, 65, 25, 61],
[11, 45, 70, 66, 94, 85, 11, 45, 70, 66, 94, 85],
[32, 14, 90, 27, 32, 73, 32, 14, 90, 27, 32, 73],
[34, 32, 47, 74, 81, 69, 34, 32, 47, 74, 81, 69],
[42, 90, 73, 51, 20, 56, 42, 90, 73, 51, 20, 56]])
arr3 = np.concatenate((img_arr,img_arr,img_arr),axis=0) plt.imshow(arr3)
|
<matplotlib.image.AxesImage at 0x2205118d290>
常用的聚合操作
array([[94, 45, 2, 65, 25, 61],
[11, 45, 70, 66, 94, 85],
[32, 14, 90, 27, 32, 73],
[34, 32, 47, 74, 81, 69],
[42, 90, 73, 51, 20, 56]])
array([292, 371, 268, 337, 332])
array([94, 94, 90, 81, 90])
常用的数学函数
- Numpy提供了标准的三角函数:sin() cos() tan()
- numpy.around(a,decimals)函数返回指定数字的四舍五入值
- 参数说明:
- a:数组
- decimals:舍入的小数位数,默认值为0,如果为负,整数将四舍五入到小数点左侧的位置
array([[-0.24525199, 0.85090352, 0.90929743, 0.82682868, -0.13235175,
-0.96611777],
[-0.99999021, 0.85090352, 0.77389068, -0.02655115, -0.24525199,
-0.17607562],
[ 0.55142668, 0.99060736, 0.89399666, 0.95637593, 0.55142668,
-0.67677196],
[ 0.52908269, 0.55142668, 0.12357312, -0.98514626, -0.62988799,
-0.11478481],
[-0.91652155, 0.89399666, -0.67677196, 0.67022918, 0.91294525,
-0.521551 ]])
3.14
常用的统计函数
- numpy.amin()和numpy.amax(),用于计算数组中的元素沿指定轴的最小、最大值
- numpy.ptp(),计算数组中元素最大值与最小值的差(最大值-最小值)
- numpy.median()函数用于计算数组a中元素的中位数(中值)
- 标准差std():标准差是一组数据平均分散程度的一种度量
- 方差var():统计中的方差(样本方差)是每个样本值与全体样本值的平均数之差的平方值的平均数,换句话说,标准差是方差的平方根
array([83, 76, 88, 47, 74, 29])
27.455519582691487
753.8055555555557
矩阵相关
- 矩阵库numpy.matlib
- numpy.matlib.identity()函数返回给定大小的单位矩阵
array([[1., 0., 0., 0., 0., 0.],
[0., 1., 0., 0., 0., 0.],
[0., 0., 1., 0., 0., 0.],
[0., 0., 0., 1., 0., 0.],
[0., 0., 0., 0., 1., 0.],
[0., 0., 0., 0., 0., 1.]])
array([[94, 11, 32, 34, 42],
[45, 45, 14, 32, 90],
[ 2, 70, 90, 47, 73],
[65, 66, 27, 74, 51],
[25, 94, 32, 81, 20],
[61, 85, 73, 69, 56]])
矩阵相乘
a1 = np.array([[2,1],[4,3]]) a2 = np.array([[1,2],[1,0]])
|
array([[3, 4],
[7, 8]])