这篇文章主要介绍了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)))

以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))
>>>printnp.arange(15).reshape(3,5)
[[01234]
[56789]
[1011121314]]
>>>printtype(np.arange(15).reshape(3,5))

使用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也可以构造矩阵对象,这里不做讨论。