在Numpy中建立了数组或者矩阵后,需要访问数组里的成员,改变元素,并对数组进行切分和计算。
索引和切片
Numpy数组的访问模式和python中的list
相似,在多维的数组中使用,
进行区分:
在python的list
下:
a = [1,2,4]
print a[2:]
打印出:
[4]
这是一个数组,在Numpy的多维数组中也采用相同的模式进行数组的访问:
import numpy as np
a = np.arange(1,37)
a = a.reshape(6,6)
print a
这里使用了 reshape
,把原来的1x36的数组,变成了6x6的矩阵。
打印:
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]
[13 14 15 16 17 18]
[19 20 21 22 23 24]
[25 26 27 28 29 30]
[31 32 33 34 35 36]]
a[1,1] = 8
print a
打印:
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]
[13 14 15 16 17 18]
[19 20 21 22 23 24]
[25 26 27 28 29 30]
[31 32 33 34 35 36]]
print a[1:4,3:]
打印:
[[10 11 12]
[16 17 18]
[22 23 24]]
在二维数组中较为简单,,
前面是横坐标,,
后面是纵坐标,可以用这种方式推广到多维的数组。
牢记这一点,再看看下面的布尔索引就简单多了:
>>> arr3 = (np.arange(36)).reshape(6,6)
>>> arr3
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23],
[24, 25, 26, 27, 28, 29],
[30, 31, 32, 33, 34, 35]])
>>> x = np.array([0, 1, 2, 1, 4, 5])
>>> arr3[x == 1]
array([[ 6, 7, 8, 9, 10, 11],
[18, 19, 20, 21, 22, 23]])
>>> arr3[:,x == 1]
array([[ 1, 3],
[ 7, 9],
[13, 15],
[19, 21],
[25, 27],
[31, 33]])
>>>
矩阵的运算
Numpy提供的较多的矩阵运算,可以查看相应的文档,这里介绍几种常见的运算方式来说明如何使用运算。
四则运算:
在加减乘除运算中,必须保证操作的数组具有相同的形状。
>>> a=np.arange(1,37)
>>> a=a.reshape(6,6)
>>> b=np.arange(1,26)
>>> b = b.reshape(5,5)
>>> a +b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (6,6) (5,5)
数组中的运算是对每个元素进行的运算,如:
import numpy as np
a = np.arange(1,7)
a = a.reshape(2,3)
print 2*a
#[[ 2 4 6]
#[ 8 10 12]]
数组的点乘
数组的点乘操作:
>>> a = [[1, 0], [0, 1]]
>>> b = [[4, 1], [2, 2]]
>>> np.dot(a, b)
array([[4, 1],
[2, 2]])
where 条件
numpy.where(condition, [x, y, ]/)
满足条件,输出x
,否则输出 y
>>> print a
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]
[13 14 15 16 17 18]
[19 20 21 22 23 24]
[25 26 27 28 29 30]
[31 32 33 34 35 36]]
>>> print np.where(a>6,a,6)
[[ 6 6 6 6 6 6]
[ 7 8 9 10 11 12]
[13 14 15 16 17 18]
[19 20 21 22 23 24]
[25 26 27 28 29 30]
[31 32 33 34 35 36]]
常用的统计函数
- 最大最小值:
按轴方向的最大最小值,如果不填参数,那按照全局来算。
min
,max
,或者amin
,amax
,要说min
和amin
有啥区别,感觉amin
是min
的升级版。
>>> print a
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]
[13 14 15 16 17 18]
[19 20 21 22 23 24]
[25 26 27 28 29 30]
[31 32 33 34 35 36]]
>>> a.min()
1
>>> a.min(0)
array([1, 2, 3, 4, 5, 6])
>>> a.min(1)
array([ 1, 7, 13, 19, 25, 31])
>>> np.amin(0)
0
>>> np.amin(1)
1
>>> np.amin(a,0)
array([1, 2, 3, 4, 5, 6])
>>>
- 最大最小值位置
argmax
和 argmin
>>> np.argmax(a)
35
>>> a.argmax()
35
>>> a.argmax(0)
array([5, 5, 5, 5, 5, 5])
>>> a.argmax(1)
array([5, 5, 5, 5, 5, 5])
>>>
- 均值和中位数
按轴方向的计算,如果不填参数,那按照全局来算。
mean
,即平均值。
median
,即中位数。
比较奇怪的是numpy.ndarray
没有实现median
。
>>> np.mean(a)
18.5
>>> a.mean()
18.5
>>> a.median()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'numpy.ndarray' object has no attribute 'median'
>>> np.median(a)
18.5
- 和
numpy.sum
对某一维进行求和运算:
import numpy as np
a = np.arange(1,7)
a = a.reshape(2,3)
print a
print np.sum(a)
# 21
#[[1 2 3]
#[4 5 6]]
print np.sum(a,0)
#[5 7 9]
print np.sum(a,1)
#[ 6 15]
- 标准差
std
按轴方向计算标准差。
>>> a.std()
10.388294694831615
>>> np.std(a)
10.388294694831615
- 方差
var
按轴方向计算方差。
>>> np.var(a)
107.91666666666667
>>> a.var()
107.91666666666667
- 协方差矩阵
cov
为协方差矩阵。
>>> np.cov(a)
array([[3.5, 3.5, 3.5, 3.5, 3.5, 3.5],
[3.5, 3.5, 3.5, 3.5, 3.5, 3.5],
[3.5, 3.5, 3.5, 3.5, 3.5, 3.5],
[3.5, 3.5, 3.5, 3.5, 3.5, 3.5],
[3.5, 3.5, 3.5, 3.5, 3.5, 3.5],
[3.5, 3.5, 3.5, 3.5, 3.5, 3.5]])
-
累积和,累积乘积
-
皮尔逊相关系数
皮尔逊相关系数:corrcoef
>>> np.corrcoef(a)
array([[1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1.]])
矩阵运算
- 相乘和点乘
所谓的点乘,也就是 大学里学习矩阵,矩阵乘法,矩阵的行向量,乘与另一个矩阵的列,在相加,得到一个向量。这样,就需要两个矩阵的行数和另一个矩阵列数,否则会报错。
>>> a = np.array([[2,3],[3,4]])
>>> b = np.array([[3,4],[4,5]])
>>> print a*b
[[ 6 12]
[12 20]]
>>> print a.dot(b)
[[18 23]
[25 32]]
Numpy提供了大量的运算函数,在机器学习中也经常用到,对Numpy的熟悉,以后学起机器学习会轻松很多。