写在前面:这篇博客内容介绍的比较简单的基本知识,适合python和机器学习零基础的人看,如果读者对numpy比较了解的话,可以pass。
- numpy
Numpy是Python的一个科学计算的库,提供了矩阵运算的功能,之前提到的梯度下降法每次迭代都需要遍历所有的数据,大大降低的程序的运算速度,如果换成矩阵运算的话将会使效率提升很多,这个时候我们就要使用到numpy的库函数了。numpy里功能较多,这篇博客就简单介绍比较基础基础的知识,
大家可以参考python中numpy入门,学习一下基本的矩阵运算,也可以参考Numpy详细介绍,本篇博客参考的内容都在上面的链接里。
- Array多维数组
NumPy的主要对象是同种元素的多维数组。这是一个所有的元素都是一种类型、通过一个正整数元组索引的元素表格(通常是元素是数字)。在NumPy中维度(dimensions)叫做轴(axes),轴的个数叫做秩(rank)。
例如,在3D空间一个点的坐标[1, 2, 3]是一个秩为1的数组,因为它只有一个轴。那个轴长度为3.又例如,在以下例子中,数组的秩为2(它有两个维度).第一个维度长度为2,第二个维度长度为3。可以简单理解为两行三列,但这个还不是矩阵,仅为了理解方便。
[[ 1., 0., 0.],
[ 0., 1., 2.]]
numpy里多维数组类型为numpy.ndarray
使用numpy.array方法
以list或tuple变量为参数产生一维数组:
print np.array([1,2,3,4])
[1 2 3 4]
print np.array((1.2,2,3,4))
[ 1.2 2. 3. 4. ]
print type(np.array((1.2,2,3,4)))
type 'numpy.ndarray'
#以list变量为元素产生二维数组:
print np.array([[1,2],[3,4]])
[[1 2]
[3 4]]
生成数组的时候还可以指定数据类型:
print np.array((1.2,2,3,4), dtype=np.int32)
[1 2 3 4]
同时也可以用numpy里的函数创建全是0或者全是1的数组:
print(np.zeros([3,4]))
[[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]]
print(np.ones([3,4]))
[[ 1. 1. 1. 1.]
[ 1. 1. 1. 1.]
[ 1. 1. 1. 1.]]
利用arange创建数组:
import numpy as np
#一维数组
print np.arange(15)
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]
print type(np.arange(15))
<type 'numpy.ndarray'>
#使用reshape函数给予数组一个新的形状,而不改变它的数据
#二维数组
print np.arange(15).reshape(3,5)
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]
#三维数组
c = np.arange(24).reshape(2,3,4) # 3d array
print c
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
print type(np.arange(15).reshape(3,5))
<type 'numpy.ndarray'>
用linspace创建数组,看下例子就知道什么意思了
import numpy as np
C = np.linspace(0,3,10)#创建数组,从0开始,间隔3,创建10个数
print C
[0,3,6,9,12,15,18,21,24,27]
基本运算
数组的算术运算是按元素的。新的数组被创建并且被结果填充。
import numpy as np
a = np.array( [1,2,3,4] )
b = arange( 4 )
print b
array([0, 1, 2, 3])
c = a-b
print c
array([1, 1, 1, 1])
b**2
array([0, 1, 4, 9])
10*sin(a)
array([ 9.12945251, -9.88031624, 7.4511316 , -2.62374854])
a<35
array([True, True, False, False], dtype=bool)
NumPy中的乘法运算符*指示按元素计算,矩阵乘法可以使用dot函数或创建矩阵对象实现
A = array( [[1,1],[0,1]] )
B = array( [[2,0],[3,4]] )
print (A*B)
[[2, 0],
[0, 4]]
print (dot(A,B))
[[5, 4],
[3, 4]]
numpy里Matrix和Array的区别
之前的博客logistic回归python实现里的代码出现了矩阵和Array相关的语句,初学的时候还是有点困惑的,这里讲一下Matrix和Array的区别,大家可参考论Numpy中Matrix和Array的区别这篇博客来详细学习下,一下内容参考该博客。
上面咱们看到numpy里的array可以创建矩阵,numpy里还有mat()就是将array矩阵化Matrix。有人就会疑问,上面还说array可以直接创建矩阵,怎么又出来一个矩阵化。其实在Numpy里matrices有个条件就是,必须是2维的;但是 numpy arrays (ndarrays) 可以是多维的(1D,2D,3D····ND)。Matrix就是Array的一个子集。matrix 拥有array的所有特性。
在numpy中matrix的主要优势是:相对简单的乘法运算符号。例如,a和b是两个matrices,那么a*b,就是矩阵积。
import numpy as np
a=np.mat('4 3; 2 1')
b=np.mat([[1,2],[3,4]])#两种表示方法,[],''均可以
print(a)
[[4 3]
[2 1]]
print(b)
[[1 2]
[3 4]]
print(a*b)#在array里计算矩阵需要用dot(),这里直接可以用*
[[13 20]
[ 5 8]]
**运算符作用也不同,Matrix是矩阵相乘,Array里则是对应的元素与元素相乘。因此,在写代码的时候Array和Matrix一定不要混淆,不然很容易出错。
以上讲的都是numpy库非常基础的知识,而且涉及的比较少,大家可以参考前面给的几个链接了解详细的内容,或者用到哪学到哪。谢谢耐心阅读。