Python: 大型数组运算

须要在大数据集(好比数组或网格) 上面执行计算,涉及到数组的重量级运算操做,可使用NumPy 库。python

下面是一个简单的小例子,展现标准列表对象和NumPy 数组对象之间的差异数组

>>> x = [1, 2, 3, 4]
>>> y = [5, 6, 7, 8]
>>> x * 2
[1, 2, 3, 4, 1, 2, 3, 4]
>>> x + 10
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "int") to list
>>> x + y
[1, 2, 3, 4, 5, 6, 7, 8]
>>> # Numpy arrays
>>> import numpy as np
>>> ax = np.array([1, 2, 3, 4])
>>> ay = np.array([5, 6, 7, 8])
>>> ax * 2
array([2, 4, 6, 8])
>>> ax + 10
array([11, 12, 13, 14])
>>> ax + ay
array([ 6, 8, 10, 12])
>>> ax * ay
array([ 5, 12, 21, 32])

 正如所见,两种方案中数组的基本数学运算结果并不相同。特别的, NumPy 中的标量运算(好比ax * 2 或ax + 10 ) 会做用在每个元素上。另外,当两个操做数都是数组的时候执行元素对等位置计算,并最终生成一个新的数组。函数

对整个数组中全部元素同时执行数学运算可使得做用在整个数组上的函数运算简单而又快速。好比,若是你想计算多项式的值,能够这样作:大数据

>>> def f(x):
... return 3*x**2 - 2*x + 7
...
>>> f(ax)
array([ 8, 15, 28, 47])

 NumPy 还为数组操做提供了大量的通用函数,这些函数能够做为math 模块中相似函数的替代。code

>>> np.sqrt(ax)
array([ 1. , 1.41421356, 1.73205081, 2. ])
>>> np.cos(ax)
array([ 0.54030231, -0.41614684, -0.9899925 , -0.65364362])

 使用这些通用函数要比循环数组并使用math 模块中的函数执行计算要快的多。所以,只要有可能的话尽可能选择NumPy 的数组方案。对象

底层实现中, NumPy 数组使用了C 或者Fortran 语言的机制分配内存。也就是说,它们是一个很是大的连续的并由同类型数据组成的内存区域。因此,能够构造一个比普通Python 列表大的多的数组。好比,若是你想构造一个10,000*10,000 的浮点数二维网格,很轻松:blog

>>> grid = np.zeros(shape=(10000,10000), dtype=float)
>>> grid
array([[ 0., 0., 0., ..., 0., 0., 0.],
[ 0., 0., 0., ..., 0., 0., 0.],
[ 0., 0., 0., ..., 0., 0., 0.],
...,
[ 0., 0., 0., ..., 0., 0., 0.],
[ 0., 0., 0., ..., 0., 0., 0.],
[ 0., 0., 0., ..., 0., 0., 0.]])

 全部的普通操做仍是会同时做用在全部元素上:索引

>>> grid += 10
>>> grid
array([[ 10., 10., 10., ..., 10., 10., 10.],
[ 10., 10., 10., ..., 10., 10., 10.],
[ 10., 10., 10., ..., 10., 10., 10.],
...,
[ 10., 10., 10., ..., 10., 10., 10.],
[ 10., 10., 10., ..., 10., 10., 10.],
[ 10., 10., 10., ..., 10., 10., 10.]])
>>> np.sin(grid)
array([[-0.54402111, -0.54402111, -0.54402111, ..., -0.54402111,
-0.54402111, -0.54402111],
[-0.54402111, -0.54402111, -0.54402111, ..., -0.54402111,
-0.54402111, -0.54402111],
[-0.54402111, -0.54402111, -0.54402111, ..., -0.54402111,
-0.54402111, -0.54402111],
...,
[-0.54402111, -0.54402111, -0.54402111, ..., -0.54402111,
-0.54402111, -0.54402111],
[-0.54402111, -0.54402111, -0.54402111, ..., -0.54402111,
-0.54402111, -0.54402111],
[-0.54402111, -0.54402111, -0.54402111, ..., -0.54402111,
-0.54402111, -0.54402111]])
>>>

 关于NumPy 有一点须要特别的主意,那就是它扩展Python 列表的索引功能- 特别是对于多维数组。为了说明清楚,先构造一个简单的二维数组并试着作些试验:内存

>>> a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
>>> a
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
>>> # Select row 1
>>> a[1]
array([5, 6, 7, 8])
>>> # Select column 1
>>> a[:,1]
array([ 2, 6, 10])
>>> # Select a subregion and change it
>>> a[1:3, 1:3]
array([[ 6, 7],
[10, 11]])
>>> a[1:3, 1:3] += 10
>>> a
array([[ 1, 2, 3, 4],
[ 5, 16, 17, 8],
[ 9, 20, 21, 12]])

>>> a + [100, 101, 102, 103]
array([[101, 103, 105, 107],
[105, 117, 119, 111],
[109, 121, 123, 115]])
>>> a
array([[ 1, 2, 3, 4],
[ 5, 16, 17, 8],
[ 9, 20, 21, 12]])
>>> # Conditional assignment on an array
>>> np.where(a < 10, a, 10)
array([[ 1, 2, 3, 4],
[ 5, 10, 10, 8],
[ 9, 10, 10, 10]])

 

NumPy 是Python 领域中不少科学与工程库的基础,同时也是被普遍使用的最大最复杂的模块。即使如此,在刚开始的时候经过一些简单的例子和玩具程序也能帮咱们完成一些有趣的事情。
一般咱们导入NumPy 模块的时候会使用语句import numpy as np 。这样的话你就不用再你的程序里面一遍遍的敲入numpy ,只须要输入np 就好了,节省了很多时间。
若是想获取更多的信息, 你固然得去NumPy 官网逛逛了, 网址是: http://www.numpy.org数学

相关文章
相关标签/搜索