1.创建数组:
创建数组的几种方式:
>>> import numpy as np
创建一维数组
>>> a=np.array([1,2,3,4])
>>> print a
[1 2 3 4]
>>> b=np.arange(5)
>>> print b
[0 1 2 3 4]
创建二维数组
>>> c=np.array([[1,2,3],[4,5,6]])
>>> print c
[[1 2 3]
[4 5 6]]
>>> d=np.arange(15).reshape(3,5)
>>> print d
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]
创建三维数组
>>> e=np.arange(16).reshape(2,2,4)
>>> print e
[[[ 0 1 2 3]
[ 4 5 6 7]]
[[ 8 9 10 11]
[12 13 14 15]]]
2.数组的基本属性
数组轴的个数
>>> a.ndim
1
>>> c.ndim
2
>>> e.ndim
3
数组在每个维度上的大小
>>> a.shape
(4L,)
>>> c.shape #表示一个2行3列的二维数组
(2L, 3L)
>>> e.shape
(2L, 2L, 4L)
数组元素的个数
>>> a.size #数组a有4个元素
4
>>> e.size
16
数组元素的类型
>>> a.dtype
dtype('int32')
3.特殊的数组
通常,数组的元素开始都是未知的,但是它的大小已知。因此,NumPy提供了一些使用占位符创建数组的函数。这最小化了扩展数组的需要和高昂的运算代价。
函数zeros创建一个全是0的数组,函数ones创建一个全1的数组,函数empty创建一个内容随机并且依赖与内存状态的数组,函数eye创建一个对角为1,其余元素均为0的数组。默认创建的数组类型(dtype)都是float64。
>>> np.zeros((2,3))
array([[ 0., 0., 0.],
[ 0., 0., 0.]])
>>> np.ones((2,3))
array([[ 1., 1., 1.],
[ 1., 1., 1.]])
>>> np.empty((2,3))
array([[ 0., 0., 0.],
[ 0., 0., 0.]])
>>> np.eye(3)
array([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.]])
4.基本运算
数组的算术运算是按元素的。新的数组被创建并且被结果填充。 生成一个1到12,步长为2的一维数组,然后重组为二维数组
>>> a=np.arange(1,12,2).reshape(2,3)
>>> print a
[[ 1 3 5]
[ 7 9 11]]
>>> b=np.array([[1,2,3],[1.1,2,5]]) #生成一个2行3列的数组
>>> print b
[[ 1. 2. 3. ]
[ 1.1 2. 5. ]]
>>> print a+b #求和,注意到结果为浮点数
[[ 2. 5. 8. ]
[ 8.1 11. 16. ]]
>>> print a**2 #对每个元素求平方
[[ 1 9 25]
[ 49 81 121]]
>>> a<8
array([[ True, True, True],
[ True, False, False]], dtype=bool)
NumPy中的乘法运算符*指示按元素计算,矩阵乘法可以使用dot函数或创建矩阵对象实现
>>> a=np.arange(4).reshape(2,2)
>>> print a
[[0 1]
[2 3]]
>>> b=np.ones((2,2))
>>> print b
[[ 1. 1.]
[ 1. 1.]]
>>> print a*b #元素乘法
[[ 0. 1.]
[ 2. 3.]]
>>> print np.dot(a,b) #矩阵乘法
[[ 1. 1.]
[ 5. 5.]]
更改数据:+=和*=
>>> a=np.array([[1,2,3],[2,2,2]])
>>> print a
[[1 2 3]
[2 2 2]]
>>> a+=a
>>> print a
[[2 4 6]
[4 4 4]]
通过指定axis参数,可以把运算应用到数组指定的轴上:
>>> a=np.arange(15).reshape(3,5)
>>> print a
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]
>>> a.sum(axis=0) #按列求和
array([15, 18, 21, 24, 27])
>>> a.cumsum(axis=1) #按行累计求和
array([[ 0, 1, 3, 6, 10],
[ 5, 11, 18, 26, 35],
[10, 21, 33, 46, 60]])
通用函数
NumPy提供常见的数学函数如 sin , cos 和 exp 。在NumPy中,这些叫作“通用函数”(ufunc)。在NumPy里这些函数作用按数组的元素运算,产生一个数组作为输出。
>>> a=np.arange(8).reshape(2,4)
>>> print a
[[0 1 2 3]
[4 5 6 7]]
>>> np.sin(a)
array([[ 0. , 0.84147098, 0.90929743, 0.14112001],
[-0.7568025 , -0.95892427, -0.2794155 , 0.6569866 ]])
>>> np.exp(a)
array([[ 1.00000000e+00, 2.71828183e+00, 7.38905610e+00,
2.00855369e+01],
[ 5.45981500e+01, 1.48413159e+02, 4.03428793e+02,
1.09663316e+03]])
5.索引,切片和迭代
数组可以被索引、切片和迭代
>>> a=np.arange(12).reshape(2,6)
>>> print a
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]]
>>> a[1,1] #通过索引获取
7
>>> a[:,2:4] #切片
array([[2, 3],
[8, 9]])
>>> for row in a : #多维数组的迭代是就第一个轴而言的
... print a
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]]
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]]
>>> for element in a.flat: #flat属性是数组元素的一个迭代器
... print element
0
1
2
3
4
5
6
7
8
9
10
11
6.更改数组的形状
>>> a=10*np.random.random((2,3)) #随机生成一个2行3列的数组
>>> print a
[[ 4.45788427 6.3795204 3.86761568]
[ 4.14255256 1.43151891 0.13187492]]
>>> b=np.floor(a) #对元素只保留整数部分
>>> print b
[[ 4. 6. 3.]
[ 4. 1. 0.]]
>>> b.ravel() #展平数组元素
array([ 4., 6., 3., 4., 1., 0.])
>>> b.shape=(3,2) #将b转换成3行2列的数组
>>> print b
[[ 4. 6.]
[ 3. 4.]
[ 1. 0.]]
>>> b.transpose() #转置,但不改变原数组
array([[ 4., 3., 1.],
[ 6., 4., 0.]])
>>> print b
[[ 4. 6.]
[ 3. 4.]
[ 1. 0.]]
7.数组组合
可以沿不同的轴方向将数组组合在一起
>>> a=np.arange(6).reshape(2,3)
>>> b=np.array([[2,3,4],[6,7,8]])
>>> print a
[[0 1 2]
[3 4 5]]
>>> print b
[[2 3 4]
[6 7 8]]
>>> np.vstack((a,b))
array([[0, 1, 2],
[3, 4, 5],
[2, 3, 4],
[6, 7, 8]])
>>> np.hstack((a,b))
array([[0, 1, 2, 2, 3, 4],
[3, 4, 5, 6, 7, 8]])
8.数组分割
使用numpy.hsplit沿着水平轴将数组分割,可以指定分割成几个数组,也可以指定在哪些列后分割。类似的,numpy.vsplit沿着纵向方向分割。
>>> a=np.arange(16).reshape(4,4)
>>> print a
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
>>> np.hsplit(a,2) #沿着水平方向将数组分割成2个
[array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13]]), array([[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15]])]
>>> np.hsplit(a,(1,3)) #在第1列和第3列前分割
[array([[ 0],
[ 4],
[ 8],
[12]]), array([[ 1, 2],
[ 5, 6],
[ 9, 10],
[13, 14]]), array([[ 3],
[ 7],
[11],
[15]])]
9.浅复制和深复制
简单的赋值既不拷贝对象,也不拷贝数据
>>> a=np.arange(4)
>>> b=a
>>> b is a #a和b是同一个数组对象的两个不同的名字
True
>>> b[0]=10
>>> print a[0] #a中元素也跟着改变
10
浅复制:不同的数组对象分享同一个数据。视图方法创造一个新的数组对象指向同一数据。
>>> c=a.view()
>>> c is a #c和a指向两个不同的对象
False
>>> c.shape=(2,2)
>>> a.shape #a的维度不改变
(4L,)
>>> c[0,0]=99
>>> a[0] #a中数据改变
99
切片操作其实返回的是一个视图
>>> d=a[:2]
>>> d[:]=11
>>> print a
[11 11 2 3]
深复制:完全复制数组对象和数据
>>> e=a.copy()
>>> e[:]=0
>>> print a #a的元素不改变
[11 11 2 3]
10.基本统计
>>> a=np.array([2,4])
>>> np.cov(a)
array(2.0)
>>> np.mean(a)
3.0
>>> np.std(a)
1.0
>>> np.var(a)
1.0