NumPy(Numerical Python的简称)是Python数值计算最重要的基础包。大多数提供科学计算的包都是用NumPy的数组作为构建基础。
1.1.1. Why NumPy?
一个强大的N维数组对象ndarray,具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组
用于集成由C、C++、Fortran等语言类库的C语言 API
线性代数、随机数生成以及傅里叶变换功能。
用于对整组数据进行快速运算的标准数学函数(无需编写循环),支持大量的数据运算
是众多机器学习框架的基础库
Tips:Python的面向数组计算可以追溯到1995年,Jim Hugunin创建了Numeric库。接下来的10年,许多科学编程社区纷纷开始使用Python的数组编程,但是进入21世纪,库的生态系统变得碎片化了。2005年,Travis Oliphant从Numeric和Numarray项目整了出了NumPy项目,进而所有社区都集合到了这个框架下。
NumPy之于数值计算特别重要的原因之一,是因为它可以高效处理大数组的数据。这是因为:
NumPy是在一个连续的内存块中存储数据,独立于其他Python内置对象。NumPy的C语言编写的算法库可以操作内存,而不必进行类型检查或其它前期工作。比起Python的内置序列,NumPy数组使用的内存更少。
NumPy可以在整个数组上执行复杂的计算,而不需要Python的for循环。
我们来直观感受一下numpy的运行速度:
导入numpy
我们将依照标准的Numpy约定,即总是使用import numpy as np
当然你也可以为了不写np, 而直接在代码中使用from numpy import *,
但是建议你最好还是不要养成这样的坏习惯。
import numpy as np
生成一个numpy对象, 一个包含一百万整数的数组
np_arr = np.arange(1000000)
一个等价的Python列表:
py_list = list(range(1000000))
对各个序列分别平方操作(%time是ipython的特殊功能,用于测试语句运行的时间需要安装ipython, pip install ipython)
%time for _ in range(10): np_arr2 = np_arr ** 2
CPU times: user 13.1 ms, sys: 5.62 ms, total: 18.8 ms Wall time: 17.7 ms
%time for _ in range(10): py_list2 = [x ** 2 for x in py_list]
CPU times: user 3.06 s, sys: 173 ms, total: 3.24 s Wall time: 3.25 s 由上述代码可以看出,基于NumPy的算法要比纯Python快10到100倍(甚至更快),并且使用的内存更少
- 创建ndarray
NumPy最重要的一个特点就是ndarray(N-dimensional array),即N维数组),该对象是一个快速而灵活的大数据集容器。你可以利用这种数组对整块数据执行一些数学运算,其语法跟标量元素之间的运算一样。
创建numpy数组的方式
import numpy as np
np.__version__
'1.15.2'
nparr = np.array([i for i in range(10)])
nparr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
nparr2 = np.array(list('abcdefg'))
nparr2
array(['a', 'b', 'c', 'd', 'e', 'f', 'g'], dtype='<U1')
nparr3 = np.array([[11, 22, 33, 44], [10, 20, 30, 40]])
nparr3
array([[11, 22, 33, 44],
[10, 20, 30, 40]])
2.1.1. arange创建数组
arange函数是python内置函数range函数的数组版本.
产生0-9共10个元素
ndarray = np.arange(10)
ndarray
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
产生从10-19共10个元素
ndarray1 = np.arange(10, 20)
产生10 12 14 16 18, 2为step
ndarray2 = np.arange(10, 20, 2)
ndarray2
array([10, 12, 14, 16, 18])
ndarray2的形状
ndarray2.shape
(5,)