logo头像

小玉的技术博客

学习numpy

Numpy简介

Numpy是一个用python实现的科学计算包。包括:1、一个强大的N维数组对象Array;2、比较成熟的(广播)函数库;3、用于整合C/C++和Fortran代码的工具包;4、实用的线性代数、傅里叶变换和随机数生成函数。numpy和稀疏矩阵运算包scipy配合使用更加方便。
NumPy(Numeric Python)提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。专为进行严格的数字处理而产生。多为很多大型金融公司使用,以及核心的科学计算组织如:Lawrence Livermore,NASA用其处理一些本来使用C++,Fortran或Matlab等所做的任务。

基础篇

NumPy的主要对象是同种元素的多维数组。这是一个所有的元素都是一种类型、通过一个正整数元组索引的元素表格(通常是元素是数字)。在NumPy中维度(dimensions)叫做轴(axes),轴的个数叫做秩(rank)。

方法简介

ndarray.ndim 数组轴的个数,在python的世界中,轴的个数被称作秩
ndarray.shape 数组的维度。这是一个指示数组在每个维度上大小的整数元组。例如一个n排m列的矩阵,它
的shape属性将是(2,3),这个元组的长度显然是秩,即维度或者ndim属性
ndarray.size 数组元素的总个数,等于shape属性中元组元素的乘积。
ndarray.dtype 一个用来描述数组中元素类型的对象,可以通过创造或指定dtype使用标准Python类型。
另外NumPy提供它自己的数据类型。
ndarray.itemsize 数组中每个元素的字节大小。例如,一个元素类型为float64的数组itemsiz属性值为
8(=64/8),又如,一个元素类型为complex32的数组item属性为4(=32/8)
ndarray.data 包含实际数组元素的缓冲区,通常我们不需要使用这个属性,因为我们总是通过索引来使
用数组中的元素。

创建数组

创建一维数组

1
2
3
4
>>>import numpy as np
>>>a=np.array([1,2,3])
>>>a
[1, 2, 3]

创建二维数组

1
2
>>> b = array( [ (1.5,2,3), (4,5,6) ] )
>>> b

[[ 1.5 2. 3. ]
[ 4. 5. 6. ]]
数组类型可以在创建时显示指定

1
2
3
import numpy as np
a=np.array([ (1.5,2,3),(4,5,6)],dtype=complex)
print a

[[ 1.5+0.j 2.0+0.j 3.0+0.j]
[ 4.0+0.j 5.0+0.j 6.0+0.j]]
通常,数组的元素开始都是未知的,但是它的大小已知。因此,NumPy提供了一些使用占位符创建数组的函数。这最小化了扩展数组的需要和高昂的运算代价。
为了创建一个数列,NumPy提供一个类似arange的函数返回数组而不是列表:

1
2
3
import numpy as np
a=np.arange(10,30,5)
print a

[10 15 20 25]
当 arange 使用浮点数参数时,由于有限的浮点数精度,通常无法预测获得的元素个数。因此,最好使用函数 linspace 去接收我们想要的元素个数来代替用range来指定步长。

基本运算

数组的算术运算是按元素的。新的数组被创建并且被结果填充。

1
2
3
4
5
import numpy as np
a=np.array([2,4,6])
b=np.array([1,3,5])
print a-b
print b**2

[1 1 1]
[ 1 9 25]
有些操作符像 += 和 *= 被用来更改已存在数组而不创建一个新的数组。

1
2
3
4
import numpy as np
a=np.array([2,4,6])
b=np.array([1,3,5])
a*=3

[ 6 12 18]
当运算的是不同类型的数组时,结果数组和更普遍和精确的已知(这种行为叫做upcast)。

1
2
3
4
5
6
import numpy as np
a=np.linspace(0,np.pi,3)
b=np.ones(3,dtype=np.int32)
print a
print b
print a+b

[ 0. 1.57079633 3.14159265]
[1 1 1]
[ 1. 2.57079633 4.14159265]

通用函数(ufunc)

NumPy提供常见的数学函数如 sin , cos 和 exp 。在NumPy中,这些叫作“通用函数”(ufunc)。在NumPy里这些函数作用按数组的元素运算,产生一个数组作为输出。

1
2
3
4
5
import numpy as np
a=np.array([1,2,3])
print np.exp(a)
print np.sqrt(a)
print np.square(a)

[ 2.71828183 7.3890561 20.08553692]
[ 1. 1.41421356 1.73205081]
[1 4 9]
更多函数all, alltrue, any, apply along axis, argmax, argmin, argsort, average, bincount, ceil, clip, conj, conjugate, corrcoef, cov, cross, cumprod, cumsum, diff, dot, floor, inner, inv, lexsort, max, maximum, mean, median, min, minimum, nonzero, outer, prod, re, round, sometrue, sort, std, sum, trace, transpose, var, vdot, vectorize, where 参见NumPy示例

索引,切片和迭代

一维 数组可以被索引、切片和迭代,就像 列表 和其它Python序列。

1
2
3
4
5
6
7
import numpy as np
a=np.arange(10)
print a
print a**3
print a[2]
print a[2:8]
print a[::-1]

[0 1 2 3 4 5 6 7 8 9]
[ 0 1 8 27 64 125 216 343 512 729]
2
[2 3 4 5 6 7]
[9 8 7 6 5 4 3 2 1 0]
多维 数组可以每个轴有一个索引。这些索引由一个逗号分割的元组给出。

tile函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>>> import numpy
>>> numpy.tile([0,0],5)#在列方向上重复[0,0]5次,默认行1次
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
>>> numpy.tile([0,0],(1,1))#在列方向上重复[0,0]1次,行1次
array([[0, 0]])
>>> numpy.tile([0,0],(2,1))#在列方向上重复[0,0]1次,行2次
array([[0, 0],
[0, 0]])
>>> numpy.tile([0,0],(3,1))
array([[0, 0],
[0, 0],
[0, 0]])
>>> numpy.tile([0,0],(1,3))#在列方向上重复[0,0]3次,行1次
array([[0, 0, 0, 0, 0, 0]])
>>> numpy.tile([0,0],(2,3))#在列方向上重复[0,0]3次,行2次</span>
array([[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0]])
支付宝打赏 微信打赏

赞赏是不耍流氓的鼓励