NumPy Basics: Arrays and
Vectorized Computation
NumPy (Numerical Python)是python进行科学计算、数据分析的一个基础的拓展库。它的一些工具:
ndarry(N-dimensional array object,N-维矩阵)快速的多维矩阵对象
线性代数运算功能
傅里叶变换
Fortran代码集成的工具
C++代码集成的工具
NumPy特点:
NumPy在创建的时候就有了固定的大小,不像Python的列表可以自动增长。改变一个数组的大小,就会创建一个新的数组,同时删除掉原来的那个。
NumPy数组里面的数据必须是同一个类型的,也因此,它们在内存上的大小是一样的(指数据)。有一个例外就是,如果给数组的是一个对象,从而可以使得数组里面的数据有不同的大小。
NumPy数组可以让在大型数据上的高级数学的或者其他类型的操作变得更加的高效。典型的一个例子,即我们可以用比标准的Python列表更少的代码和更高效实现这些操作。
有非常多的科学上的或者数学上的Python包都使用了NumPy。尽管这些包都支持传统的Python列表输入,但是在处理之前,都会转换成NumPy的数组,而且它们更多的是NumPy数组。换句话说,为了能高效的利用目前大部分(甚至是所有)的科学数学的Python程序,仅仅知道Python内建的列表是不够的,你们必须了解和会使用NumPy数组。
The NumPy ndarray:A Multidimensional Array Object
python中快速、灵活处理大数据的工具。
ndarray的运算
In
[45]: arr = np.array([[1., 2., 3.], [4., 5.,
6.]])
In [46]: arr
Out[46]:
array([[ 1., 2., 3.],
[ 4., 5., 6.]])
In [47]: arr * arr
Out[47]:
array([[ 1., 4., 9.]
[ 16., 25., 36.]]) |
Basic Indexing and Slicing
In
[51]: arr = np.arange(10)
In [52]: arr
Out[52]: array([0, 1, 2, 3, 4, 5, 6, 7, 8,
9])
In [53]: arr[5]
Out[53]: 5
In [54]: arr[5:8]
Out[54]: array([5, 6, 7])
In [55]: arr[5:8] = 12
In [56]: arr
Out[56]: array([ 0, 1, 2, 3, 4, 12, 12, 12,
8, 9]) |
随机数的生成
numpy.random模块对Python内置的random进行了补充,一次可以生成多个样本值。
用normal得到正态分布的数组
In [208]: samples = np.random.normal(size=(4,
4))
In [209]: samples
Out[209]:
array([[ 0.1241, 0.3026, 0.5238, 0.0009],
[ 1.3438, -0.7135, -0.8312, -2.3702],
[-1.8608, -0.8608, 0.5601, -1.2659],
[ 0.1198, -1.0635, 0.3329, -2.3594]]) |
如果需要产生大量的样本值,numpy.random就快了不止一个数量级。
In
[210]: from random import normalvariate
In [211]: N = 1000000
In [212]: %timeit samples = [normalvariate(0,
1) for _ in xrange(N)]
1 loops, best of 3: 1.33 s per loop
In [213]: %timeit np.random.normal(size=N)
10 loops, best of 3: 57.7 ms per loop |
An Example of Randam Walks
import
random
position = 0
walk = [position]
steps = 1000
for i in xrange(steps):
step = 1 if random.randint(0, 1) else -1
position += step
walk.append(position) |
看一下结果。
计算走过的最大正距离和负距离
In
[215]: nsteps = 1000
In [216]: draws = np.random.randint(0, 2,
size=nsteps)
In [217]: steps = np.where(draws > 0, 1,
-1)
In [218]: walk = steps.cumsum()
In [219]: walk.min() In [220]: walk.max()
Out[219]: -3 Out[220]: 31 |
|