TutorialsPoint NumPy 教程
译者:飞龙
NumPy - 简介
NumPy 是一个 Python 包。 它代表 “Numeric Python”。 它是一个由多维数组对象和用于处理数组的例程集合组成的库。
Numeric,即 NumPy 的前身,是由 Jim Hugunin 开发的。 也开发了另一个包 Numarray ,它拥有一些额外的功能。 2005年,Travis Oliphant 通过将 Numarray 的功能集成到 Numeric 包中来创建 NumPy 包。 这个开源项目有很多贡献者。
NumPy 操作
使用NumPy,开发人员可以执行以下操作:
-
数组的算数和逻辑运算。
-
傅立叶变换和用于图形操作的例程。
-
与线性代数有关的操作。 NumPy 拥有线性代数和随机数生成的内置函数。
NumPy – MatLab 的替代之一
NumPy 通常与 SciPy(Scientific Python)和 Matplotlib(绘图库)一起使用。 这种组合广泛用于替代 MatLab,是一个流行的技术计算平台。 但是,Python 作为 MatLab 的替代方案,现在被视为一种更加现代和完整的编程语言。
NumPy 是开源的,这是它的一个额外的优势。
NumPy - 环境
在线尝试
我们已经在线设置了 NumPy 编程环境,以便在线编译和执行所有可用的示例。 它向你提供了信心,并使您能够使用不同的选项验证程序, 随意修改任何示例并在线执行。
使用我们的在线编译器尝试一下示例,它位于 CodingGround
import numpy as np a = 'hello world' print a
对于本教程中给出的大多数示例,你会在我们的网站代码部分的右上角找到一个
Try it
选项,这会把你带到在线编译器。 所以快来使用它,享受你的学习吧。
标准的 Python 发行版不会与 NumPy 模块捆绑在一起。 一个轻量级的替代方法是使用流行的 Python 包安装程序 pip 来安装 NumPy。
pip install numpy
启用 NumPy 的最佳方法是使用特定于您的操作系统的可安装的二进制包。 这些二进制包含完整的 SciPy 技术栈(包括 NumPy,SciPy,matplotlib,IPython,SymPy 以及 Python 核心自带的其它包)。
Windows
Anaconda (from www.continuum.io) 是一个带有 SciPy 技术栈的免费 Python 发行版。 它也可用于 Linux 和 Mac.
Canopy (www.enthought.com/products/canopy/) 是可用的免费和商业发行版,带有完整的 SciPy 技术栈,可用于 Windows, Linux and Mac。
Python (x,y): 是个免费的 Python 发行版,带有 SciPy 技术栈和 Spyder IDE,可用于 Windows。 (从这里下载:www.python-xy.github.io/)
Linux
Linux 发行版的相应软件包管理器可用于安装一个或多个 SciPy 技术栈中的软件包。
对于 Ubuntu
sudo apt-get install python-numpy
python-scipy python-matplotlibipythonipythonnotebook python-pandas
python-sympy python-nose
对于 Fedora
sudo yum install numpyscipy python-matplotlibipython
python-pandas sympy python-nose atlas-devel
从源码构建
核心 Python(2.6.x,2.7.x 和 3.2.x 起)必须安装distutils
,zlib
模块应该启用。
GNU gcc(4.2及以上)C 编译器必须可用。
要安装 NumPy,请运行以下命令。
Python setup.py install
要测试 NumPy 模块是否正确安装,请尝试从 Python 提示符导入它。
如果未安装,将显示以下错误消息。
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
import numpy
ImportError: No module named 'numpy'
或者,使用以下语法导入NumPy包。
NumPy - Ndarray 对象
NumPy 中定义的最重要的对象是称为 ndarray
的 N 维数组类型。 它描述相同类型的元素集合。 可以使用基于零的索引访问集合中的项目。
ndarray
中的每个元素在内存中使用相同大小的块。 ndarray
中的每个元素是数据类型对象的对象(称为 dtype
)。
从ndarray
对象提取的任何元素(通过切片)由一个数组标量类型的 Python 对象表示。 下图显示了ndarray
,数据类型对象(dtype
)和数组标量类型之间的关系。
如果矩阵成为A
、X
和B
,方程变为:
AX = B
或
X = A^(-1)B
numpy.linalg.inv()
我们使用numpy.linalg.inv()
函数来计算矩阵的逆。 矩阵的逆是这样的,如果它乘以原始矩阵,则得到单位矩阵。
例子
import numpy as np
x = np.array([[1,2],[3,4]])
y = np.linalg.inv(x)
print x
print y
print np.dot(x,y)
输出如下:
[[1 2]
[3 4]]
[[-2. 1. ]
[ 1.5 -0.5]]
[[ 1.00000000e+00 1.11022302e-16]
[ 0.00000000e+00 1.00000000e+00]]
例子
现在让我们在示例中创建一个矩阵A的逆。
import numpy as np
a = np.array([[1,1,1],[0,2,5],[2,5,-1]])
print '数组 a:'
print a
ainv = np.linalg.inv(a)
print 'a 的逆:'
print ainv
print '矩阵 b:'
b = np.array([[6],[-4],[27]])
print b
print '计算:A^(-1)B:'
x = np.linalg.solve(a,b)
print x
# 这就是线性方向 x = 5, y = 3, z = -2 的解
输出如下:
数组 a:
[[ 1 1 1]
[ 0 2 5]
[ 2 5 -1]]
a 的逆:
[[ 1.28571429 -0.28571429 -0.14285714]
[-0.47619048 0.14285714 0.23809524]
[ 0.19047619 0.14285714 -0.0952381 ]]
矩阵 b:
[[ 6]
[-4]
[27]]
计算:A^(-1)B:
[[ 5.]
[ 3.]
[-2.]]
结果也可以使用下列函数获取
x = np.dot(ainv,b)
NumPy - Matplotlib
Matplotlib 是 Python 的绘图库。 它可与 NumPy 一起使用,提供了一种有效的 MatLab 开源替代方案。 它也可以和图形工具包一起使用,如 PyQt 和 wxPython。
Matplotlib 模块最初是由 John D. Hunter 编写的。 自 2012 年以来,Michael Droettboom 是主要开发者。 目前,Matplotlib 1.5.1 是可用的稳定版本。 该软件包可以二进制分发,其源代码形式在 www.matplotlib.org 上提供。
通常,通过添加以下语句将包导入到 Python 脚本中:
from matplotlib import pyplot as plt
这里pyplot()
是 matplotlib 库中最重要的函数,用于绘制 2D 数据。 以下脚本绘制方程y = 2x + 5
:
示例
import numpy as np
from matplotlib import pyplot as plt
x = np.arange(1,11)
y = 2 * x + 5
plt.title("Matplotlib demo")
plt.xlabel("x axis caption")
plt.ylabel("y axis caption")
plt.plot(x,y) plt.show()
ndarray
对象x
由np.arange()
函数创建为x
轴上的值。y
轴上的对应值存储在另一个数组对象y
中。 这些值使用matplotlib
软件包的pyplot
子模块的plot()
函数绘制。
图形由show()
函数展示。
上面的代码应该产生以下输出:
Matplotlib Demo作为线性图的替代,可以通过向plot()
函数添加格式字符串来显示离散值。 可以使用以下格式化字符。
字符 | 描述 | |
---|---|---|
'-' |
实线样式 | |
'--' |
短横线样式 | |
'-.' |
点划线样式 | |
':' |
虚线样式 | |
'.' |
点标记 | |
',' |
像素标记 | |
'o' |
圆标记 | |
'v' |
倒三角标记 | |
'^' |
正三角标记 | |
'<' |
左三角标记 | |
'>' |
右三角标记 | |
'1' |
下箭头标记 | |
'2' |
上箭头标记 | |
'3' |
左箭头标记 | |
'4' |
右箭头标记 | |
's' |
正方形标记 | |
'p' |
五边形标记 | |
'*' |
星形标记 | |
'h' |
六边形标记 1 | |
'H' |
六边形标记 2 | |
'+' |
加号标记 | |
'x' |
X 标记 | |
'D' |
菱形标记 | |
'd' |
窄菱形标记 | |
`' | '` | 竖直线标记 |
'_' |
水平线标记 |
还定义了以下颜色缩写。
字符 | 颜色 |
---|---|
'b' |
蓝色 |
'g' |
绿色 |
'r' |
红色 |
'c' |
青色 |
'm' |
品红色 |
'y' |
黄色 |
'k' |
黑色 |
'w' |
白色 |
要显示圆来代表点,而不是上面示例中的线,请使用ob
作为plot()
函数中的格式字符串。
示例
import numpy as np
from matplotlib import pyplot as plt
x = np.arange(1,11)
y = 2 * x + 5
plt.title("Matplotlib demo")
plt.xlabel("x axis caption")
plt.ylabel("y axis caption")
plt.plot(x,y,"ob")
plt.show()
上面的代码应该产生以下输出:
Color Abbreviation绘制正弦波
以下脚本使用 matplotlib 生成正弦波图。
示例
import numpy as np
import matplotlib.pyplot as plt
# 计算正弦曲线上点的 x 和 y 坐标
x = np.arange(0, 3 * np.pi, 0.1)
y = np.sin(x)
plt.title("sine wave form")
# 使用 matplotlib 来绘制点
plt.plot(x, y)
plt.show()
Sine Wave
subplot()
subplot()
函数允许你在同一图中绘制不同的东西。 在下面的脚本中,绘制正弦和余弦值。
示例
import numpy as np
import matplotlib.pyplot as plt
# 计算正弦和余弦曲线上的点的 x 和 y 坐标
x = np.arange(0, 3 * np.pi, 0.1)
y_sin = np.sin(x)
y_cos = np.cos(x)
# 建立 subplot 网格,高为 2,宽为 1
# 激活第一个 subplot
plt.subplot(2, 1, 1)
# 绘制第一个图像
plt.plot(x, y_sin)
plt.title('Sine')
# 将第二个 subplot 激活,并绘制第二个图像
plt.subplot(2, 1, 2)
plt.plot(x, y_cos)
plt.title('Cosine')
# 展示图像
plt.show()
上面的代码应该产生以下输出:
Sub Plotbar()
pyplot
子模块提供bar()
函数来生成条形图。 以下示例生成两组x
和y
数组的条形图。
示例
from matplotlib import pyplot as plt
x = [5,8,10]
y = [12,16,6]
x2 = [6,9,11]
y2 = [6,15,7]
plt.bar(x, y, align = 'center')
plt.bar(x2, y2, color = 'g', align = 'center')
plt.title('Bar graph')
plt.ylabel('Y axis')
plt.xlabel('X axis')
plt.show()
NumPy - 使用 Matplotlib 绘制直方图
NumPy 有一个numpy.histogram()
函数,它是数据的频率分布的图形表示。 水平尺寸相等的矩形对应于类间隔,称为bin
,变量height
对应于频率。
numpy.histogram()
numpy.histogram()
函数将输入数组和bin
作为两个参数。 bin
数组中的连续元素用作每个bin
的边界。
import numpy as np
a = np.array([22,87,5,43,56,73,55,54,11,20,51,5,79,31,27]) ]
np.histogram(a,bins = [0,20,40,60,80,100])
hist,bins = np.histogram(a,bins = [0,20,40,60,80,100])
print hist
print bins
输出如下:
[3 4 5 2 1]
[0 20 40 60 80 100]
plt()
Matplotlib 可以将直方图的数字表示转换为图形。 pyplot
子模块的plt()
函数将包含数据和bin
数组的数组作为参数,并转换为直方图。
from matplotlib import pyplot as plt
import numpy as np
a = np.array([22,87,5,43,56,73,55,54,11,20,51,5,79,31,27])
plt.hist(a, bins = [0,20,40,60,80,100])
plt.title("histogram")
plt.show()
输出如下:
Histogram PlotNumPy - IO
ndarray
对象可以保存到磁盘文件并从磁盘文件加载。 可用的 IO 功能有:
-
load()
和save()
函数处理 numPy 二进制文件(带npy
扩展名) -
loadtxt()
和savetxt()
函数处理正常的文本文件
NumPy 为ndarray
对象引入了一个简单的文件格式。 这个npy
文件在磁盘文件中,存储重建ndarray
所需的数据、图形、dtype
和其他信息,以便正确获取数组,即使该文件在具有不同架构的另一台机器上。
numpy.save()
numpy.save()
文件将输入数组存储在具有npy
扩展名的磁盘文件中。
import numpy as np
a = np.array([1,2,3,4,5])
np.save('outfile',a)
为了从outfile.npy
重建数组,请使用load()
函数。
import numpy as np
b = np.load('outfile.npy')
print b
输出如下:
array([1, 2, 3, 4, 5])
save()
和load()
函数接受一个附加的布尔参数allow_pickles
。 Python 中的pickle
用于在保存到磁盘文件或从磁盘文件读取之前,对对象进行序列化和反序列化。
savetxt()
以简单文本文件格式存储和获取数组数据,是通过savetxt()
和loadtx()
函数完成的。
示例
import numpy as np
a = np.array([1,2,3,4,5])
np.savetxt('out.txt',a)
b = np.loadtxt('out.txt')
print b
输出如下:
[ 1. 2. 3. 4. 5.]
savetxt()
和loadtxt()
数接受附加的可选参数,例如页首,页尾和分隔符。
NumPy - 实用资源
以下资源包含有关 NumPy 的其他信息。 请使用它们获得更多的深入知识。