转自:https://www.runoob.com/numpy/numpy-tutorial.html
https://www.numpy.org.cn/article/basics/understanding_numpy.html#什么是-numpy
(怕后面该网址没有了,转载作为自己的学习笔记)
1、NumPy教程
NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
NumPy 的前身 Numeric 最早是由 Jim Hugunin 与其它协作者共同开发,2005 年,Travis Oliphant 在 Numeric 中结合了另一个同性质的程序库 Numarray 的特色,并加入了其它扩展而开发了 NumPy。NumPy 为开放源代码并且由许多协作者共同维护开发。
NumPy是一个运行速度非常快的数学库,主要用于数组计算,包含:
一个强大的N维数组对象ndarray
广播功能函数
整合C/C++/Fortran代码的工具
线性代数、傅里叶函数、随机数生成等功能
1.1、什么是Numpy?
NumPy是一个功能强大的Python库,主要用于对多维数组执行计算。NumPy这个词来源于两个单词-- Numerical和Python。NumPy提供了大量的库函数和操作,可以帮助程序员轻松地进行数值计算。这类数值计算广泛用于以下任务:
机器学习模型:在编写机器学习算法时,需要对矩阵进行各种数值计算。例如矩阵乘法、换位、加法等。NumPy提供了一个非常好的库,用于简单(在编写代码方面)和快速(在速度方面)计算。NumPy数组用于存储训练数据和机器学习模型的参数。
图像处理和计算机图形学:计算机中的图像表示为多维数字数组。NumPy成为同样情况下最自然的选择。实际上,NumPy提供了一些优秀的库函数来快速处理图像。例如,镜像图像、按特定角度旋转图像等。
数学任务:NumPy对于执行各种数学任务非常有用,如数值积分、微分、内插、外推等。因此,当涉及到数学任务时,它形成了一种基于Python的MATLAB的快速替代。
1.2、NumPy应用
NumPy 通常与 SciPy(Scientific Python)和 Matplotlib(绘图库)一起使用, 这种组合广泛用于替代 MatLab,是一个强大的科学计算环境,有助于我们通过 Python 学习数据科学或者机器学习。
SciPy 是一个开源的 Python 算法库和数学工具包。
SciPy 包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算。
Matplotlib 是 Python 编程语言及其数值数学扩展包 NumPy 的可视化操作界面。它为利用通用的图形用户界面工具包,如 Tkinter, wxPython, Qt 或 GTK+ 向应用程序嵌入式绘图提供了应用程序接口(API)。
1.3、相关链接
- NumPy 官网 http://www.numpy.org/
- NumPy 源代码:https://github.com/numpy/numpy
- SciPy 官网:https://www.scipy.org/
- SciPy 源代码:https://github.com/scipy/scipy
- Matplotlib 官网:https://matplotlib.org/
- Matplotlib 源代码:https://github.com/matplotlib/matplotlib
1.4 NumPy安装
在你的计算机上安装NumPy的最快也是最简单的方法是在shell上使用以下命令:
pip install numpy
这将在你的计算机上安装最新/最稳定的NumPy版本。通过PIP安装是安装任何Python软件包的最简单方法。现在让我们来谈谈NumPy中最重要的概念,NumPy数组。
如果是Anacanda中使用conda安装的话,命令是:
conda install numpy
1.5 NumPy中的数组
NumPy提供的最重要的数据结构是一个称为NumPy数组的强大对象。NumPy数组是通常的Python数组的扩展。NumPy数组配备了大量的函数和运算符,可以帮助我们快速编写上面讨论过的各种类型计算的高性能代码。让我们看看如何快速定义一维NumPy数组:
# -*- coding: UTF-8 -*-
import numpy as np
my_array = np.array([1,2,3,4,5])
print(my_array)
最后,运行结果如下:
Python 3.7.4 (default, Aug 9 2019, 18:34:13) [MSC v.1915 64 bit (AMD64)]
Type 'copyright', 'credits' or 'license' for more information
IPython 7.8.0 -- An enhanced Interactive Python. Type '?' for help.
PyDev console: using IPython 7.8.0
Python 3.7.4 (default, Aug 9 2019, 18:34:13) [MSC v.1915 64 bit (AMD64)] on win32
In[2]: runfile('E:/workspace/numpy/numpy/01_numpy数组.py', wdir='E:/workspace/numpy/numpy')
[1 2 3 4 5]
在上面的简单示例中,我们首先使用import numpy作为np导入NumPy库。然后,我们创建了一个包含5个整数的简单NumPy数组,然后我们将其打印出来。继续在自己的机器上试一试。在看 “NumPy安装” 部分下面的步骤的时候,请确保已在计算机中安装了NumPy。
现在让我们看看我们可以用这个特定的NumPy数组能做些什么。
print(my_array.shape)
它会打印我们创建的数组的形状:(5,)。意思就是my_array是一个包含5个元素的数组。
我们也可以打印各个元素。就像普通的Python数组一样,NumPy数组的起始索引编号为0.
print(my_array[0])
print(my_array[1])
运行结果是:
1
2
上述命令将分别在终端上打印1和2.我们还可以修改NumPy数组的元素。例如,加入我们编写以下2个命令:
my_array[0] = -1
print(my_array)
我们将在屏幕上看到:[-1 2 3 4 5]
现在假设,我们要创建一个长度为5的NumPy数组,但所有元素都为0,我们可以这样做吗?是的。NumPy提供了一种简单的方法来做同样的事情。
my_new_array = np.zeros((5))
print(my_new_array)
我们将看到输出了[0. 0. 0. 0. 0.]。与np.zeros类似,我们也有np.ones。如果我们想创建一个随机值数组怎么办?
my_random_array = np.random.random((5))
print(my_random_array)
我们得到的输出看起来像 [0.22051844 0.35278286 0.11342404 0.79671772 0.62263151] 这样的数据。你获得的输出可能会有所不同,因为我们使用的是随机函数,它为每个元素分配0到1之间的随机值。
现在让我们看看如何使用NumPy创建二维数组。
my_2d_array = np.zeros((2,3))
print(my_2d_array)
这里是:
[[0. 0. 0.]
[0. 0. 0.]]
猜猜以下代码的输出结果如何:
my_2d_array_new = np.ones((2,4))
print(my_2d_array_new)
这里是:
[[1. 1. 1. 1.]
[1. 1. 1. 1.]]
基本上,当你使用函数np.zeros()或np.ones()时,你可以指定讨论数组大小的元组。在上面的两个例子中,我们使用以下元组,(2, 3) 和(2, 4) 分别表示2行,3列和4列。像上面那样的多维数组可以用 my_array[i][j] 符号来索引,其中i表示行号,j表示列号。i和j都从0开始。
my_array = np.array([[4,5],[6,1]])
print(my_array)
print(my_array[0][1])
输出结果是:
[[4 5]
[6 1]]
5
上面的代码片段的输出是5,因为它是索引0行和索引1列中的元素。
你还可以按如下方式打印my_array的形状:
print(my_array.shape)
输出为(2,2),表示数组中有2行2列。
NumPy提供了一种提取多维数组的列/列的强大方法。例如,考虑我们上面定义的my_array的例子。
[[4,5],[6,1]]
假设,我们想从中提取第二列(索引1)的所有元素。在这里,我们肉眼可以看见,第二列由两个元素组成:5和1。为此,我们执行以下操作:
my_array_column_2 = my_array[:,1]
print(my_array_column_2)
注意,我们使用了冒号(:)而不是行号,而对于列号,我们使用了值1,最终输出是:[5, 1]。
我们可以类似地从多维NumPy数组中提取一行。现在,让我们看看NumPy在多个数组上执行计算时提供的强大功能。
1.6 NumPy中的数组操作
使用NumPy,你可以轻松在数组上执行数学运算。例如,你可以添加NumPy数组,你可以减去它们,你可以将它们相乘,甚至可以将它们分开。以下是一些例子:
# -*- coding: UTF-8 -*-
import numpy as np
a = np.array([[1.0, 2.0], [3.0, 4.0]])
b = np.array([[5.0, 6.0], [7.0, 8.0]])
sum = a + b
difference = a - b
product = a * b
quotient = a / b
print("Sum = \n",sum)
print("Difference = \n", difference)
print("Product = \n", product)
print("Quotient = \n", quotient)
运行结果:
Sum =
[[ 6. 8.]
[10. 12.]]
Difference =
[[-4. -4.]
[-4. -4.]]
Product =
[[ 5. 12.]
[21. 32.]]
Quotient =
[[0.2 0.33333333]
[0.42857143 0.5 ]]
如你所见,乘法运算符执行逐元素乘法而不是矩阵乘法。要执行矩阵乘法,你可以执行以下操作:
matrix_product = a.dot(b)
print("Matrix Product = ",matrix_product)
运行结果:
Matrix Product = [[19. 22.]
[43. 50.]]