这篇文章主要介绍了Python中的Numpy入门教程,着重讲解了矩阵中的数组操作,需要的朋友可以参考下
1、Numpy是什么
很简单,Numpy是Python的一个科学计算的库,提供了矩阵运算的功能,其一般与Scipy、matplotlib一起使用。其实,list已经提供了类似于矩阵的表示形式,不过numpy为我们提供了更多的函数。如果接触过matlab、scilab,那么numpy很好入手。在以下的代码示例中,总是先导入了numpy:
代码如下:
>>>importnumpyasnp
>>>printnp.version.version
1.6.2
2、多维数组
多维数组的类型是:numpy.ndarray。
使用numpy.array方法
以list或tuple变量为参数产生一维数组:
代码如下:>>>printnp.array([1,2,3,4])
[1234]
>>>printnp.array((1.2,2,3,4))
[1.22.3.4.]
>>>printtype(np.array((1.2,2,3,4)))
<type'numpy.ndarray'>
以list或tuple变量为元素产生二维数组:
代码如下:
>>>printnp.array([[1,2],[3,4]])
[[12]
[34]]
生成数组的时候,可以指定数据类型,例如numpy.int32,numpy.int16,andnumpy.float64等:
代码如下:
>>>printnp.array((1.2,2,3,4),dtype=np.int32)
[1234]
使用numpy.arange方法
代码如下:
>>>printnp.arange(15)
[01234567891011121314]
>>>printtype(np.arange(15))
<type'numpy.ndarray'>
>>>printnp.arange(15).reshape(3,5)
[[01234]
[56789]
[1011121314]]
>>>printtype(np.arange(15).reshape(3,5))
<type'numpy.ndarray'>
使用numpy.linspace方法
例如,在从1到3中产生9个数:
代码如下:
>>>printnp.linspace(1,3,9)
[1.1.251.51.752.2.252.52.753.]
使用numpy.zeros,numpy.ones,numpy.eye等方法可以构造特定的矩阵
例如:
代码如下:
>>>printnp.zeros((3,4))
[[0.0.0.0.]
[0.0.0.0.]
[0.0.0.0.]]
>>>printnp.ones((3,4))
[[1.1.1.1.]
[1.1.1.1.]
[1.1.1.1.]]
>>>printnp.eye(3)
[[1.0.0.]
[0.1.0.]
[0.0.1.]]
创建一个三维数组:
代码如下:
>>>printnp.zeros((2,2,2))
[[[0.0.]
[0.0.]]
[[0.0.]
[0.0.]]]
获取数组的属性:
代码如下:
>>>a=np.zeros((2,2,2))
>>>printa.ndim#数组的维数
3
>>>printa.shape#数组每一维的大小
(2,2,2)
>>>printa.size#数组的元素数
8
>>>printa.dtype#元素类型
float64
>>>printa.itemsize#每个元素所占的字节数
8
数组索引,切片,赋值
示例:
代码如下:
>>>a=np.array([[2,3,4],[5,6,7]])
>>>printa
[[234]
[567]]
>>>printa[1,2]
7
>>>printa[1,:]
[567]
>>>printa[1,1:2]
[6]
>>>a[1,:]=[8,9,10]
>>>printa
[[234]
[8910]]
使用for操作元素
代码如下:
>>>forxinnp.linspace(1,3,3):
...printx
...
1.0
2.0
3.0
基本的数组运算
先构造数组a、b:
代码如下:
>>>a=np.ones((2,2))
>>>b=np.eye(2)
>>>printa
[[1.1.]
[1.1.]]
>>>printb
[[1.0.]
[0.1.]]
数组的加减乘除:
代码如下:
>>>printa>2
[[FalseFalse]
[FalseFalse]]
>>>printa+b
[[2.1.]
[1.2.]]
>>>printa-b
[[0.1.]
[1.0.]]
>>>printb*2
[[2.0.]
[0.2.]]
>>>print(a*2)*(b*2)
[[4.0.]
[0.4.]]
>>>printb/(a*2)
[[0.50.]
[0.0.5]]
>>>print(a*2)**4
[[16.16.]
[16.16.]]
使用数组对象自带的方法:
代码如下:
>>>a.sum()
4.0
>>>a.sum(axis=0)#计算每一列(二维数组中类似于矩阵的列)的和
array([2.,2.])
>>>a.min()
1.0
>>>a.max()
1.0
使用numpy下的方法:
代码如下:
>>>np.sin(a)
array([[0.84147098,0.84147098],
[0.84147098,0.84147098]])
>>>np.max(a)
1.0
>>>np.floor(a)
array([[1.,1.],
[1.,1.]])
>>>np.exp(a)
array([[2.71828183,2.71828183],
[2.71828183,2.71828183]])
>>>np.dot(a,a)##矩阵乘法
array([[2.,2.],
[2.,2.]])
合并数组
使用numpy下的vstack和hstack函数:
代码如下:
>>>a=np.ones((2,2))
>>>b=np.eye(2)
>>>printnp.vstack((a,b))
[[1.1.]
[1.1.]
[1.0.]
[0.1.]]
>>>printnp.hstack((a,b))
[[1.1.1.0.]
[1.1.0.1.]]
看一下这两个函数有没有涉及到浅拷贝这种问题:
代码如下:
>>>c=np.hstack((a,b))
>>>printc
[[1.1.1.0.]
[1.1.0.1.]]
>>>a[1,1]=5
>>>b[1,1]=5
>>>printc
[[1.1.1.0.]
[1.1.0.1.]]
可以看到,a、b中元素的改变并未影响c。
深拷贝数组
数组对象自带了浅拷贝和深拷贝的方法,但是一般用深拷贝多一些:
代码如下:>>>a=np.ones((2,2))
>>>b=a
>>>bisa
True
>>>c=a.copy()#深拷贝
>>>cisa
False
基本的矩阵运算
转置:
代码如下:
>>>a=np.array([[1,0],[2,3]])
>>>printa
[[10]
[23]]
>>>printa.transpose()
[[12]
[03]]
迹:
代码如下:>>>printnp.trace(a)
4
numpy.linalg模块中有很多关于矩阵运算的方法:
代码如下:
>>>importnumpy.linalgasnplg
特征值、特征向量:
代码如下:
>>>printnplg.eig(a)
(array([3.,1.]),array([[0.,0.70710678],
[1.,-0.70710678]]))3、矩阵
numpy也可以构造矩阵对象,这里不做讨论。
更多信息请查看IT技术专栏