- 大型数据运算
-问题:
- 解决方案:
- 涉及到数组的重量级运算,可以使用 Numpy 库。Numpy 的一个主要特征是他会给 Python 提 供一个数组对象,相比标准的 Python 列表更适合用来做数学运算。下面展示标准列表和 Numpy 数组之间的差别:
x = [1, 2, 3, 4]
y = [5, 6, 7, 8]
print(x*2)
# [1, 2, 3, 4, 1, 2, 3, 4]
# print(x + 10)
# TypeError: can only concatenate list (not "int") to list
print(x + y)
# [1, 2, 3, 4, 5, 6, 7, 8]
import numpy as np
ax = np.array([1, 2, 3, 4])
ay = np.array([5, 6, 7, 8])
print(ax*2) # [2 4 6 8]
print(ax + 10) # [11 12 13 14]
print(ax + ay) # [ 6 8 10 12]
- 正如所见,两种方案中数组的基本数学运算结果并不相同。Numpy 中的标量运算(比如,ax*2
- 或者 ax + 10)会作用在每一个元素上。另外当两个操作都是数组的时候执行元素对等位置计 算,并最终生成一个新的数字。
- 对于整个数组中所有元素同时执行数学运算可以使得作用在整个数组上的函数运算简单又快速。比如,想计算多项式的值,可以这样做:
def f(x):
return 3 * x**2 -2*x +7
f(ax) # [ 8 15 28 47]
- Numpy 还为数组操作提供了大量的通用函数,这些函数可以作为 math 模块中类似函数的替 代。比如:
np.sqrt(ax)
# [1. 1.41421356 1.73205081 2. ]
np.cos(ax)
# [ 0.54030231 -0.41614684 -0.9899925 -0.65364362]
- 使用这些通用函数要比循环数组并使用 math 模块中的函数执行计算要快的多。因此,只要有 可能就尽量选择 Numpy 的数组方案。
- 底层实现中,Numpy 数组使用了 C 或者 Fortran 语言的机制分配内存。也就是说,它们是 一个非常大的连续的并由同类型数据组成的内存区域。所以,可以构造一个比普通 Python 列表 大的多的数组。比如,想构建一个10000*10000的浮点数二维网格,很轻松:
grid = np.zeros(shape = (10000,10000), dtype = float)
print(grid)
"""
[[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
print(grid)
"""
[[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.]]
"""
- 关于 Numpy 有一个需要注意,那就是它扩展 Python 泪奔的索引功能,特别是对于多维数组, 为了说明清楚,先构建一个简单的二维数组并试着做些试验:
a = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
])
print(a)
"""
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
"""
print(a[1]) # [5 6 7 8]
print(a[:,1]) # [ 2 6 10]
print(a[1:3,1:3])
"""
[[ 6 7]
[10 11]]
"""
a[1:3, 1:3] += 10
print(a)
"""
[[ 1 2 3 4]
[ 5 16 17 8]
[ 9 20 21 12]]
"""
print(a + [100, 101, 102, 103])
"""
[[101 103 105 107]
[105 117 119 111]
[109 121 123 115]]
"""
print(a)
"""
[[ 1 2 3 4]
[ 5 16 17 8]
[ 9 20 21 12]]
"""
np.where(a < 10, a, 10)
"""
[[ 1 2 3 4]
[ 5 10 10 8]
[ 9 10 10 10]]
"""
- 讨论: Numpy 是 Python 领域中很多科学与工程库的基础,同时也是被广泛使用的最大最复 杂的模块。即便如此,在刚开始的时候通过一些简单例子和玩具程序,也能完成一些有趣的事情。
- 通常我们导入 Numpy 模块的时候会使用语句 import Numpy as np 。这样在后面只要输 入np就行了,省事不少。
- Numpy 官网:http://www.numpy.org