Numpy是python在科学计算方面的一个基础库,他还包含了一些其它的东西:

  • 一个强大的n维数组对象
  • 复杂的广播功能
  • 用来整合c/c++和Fortran的工具
  • 有用的线性代数,傅立叶变换和随机数功能
    除了它明显的科学用途之外,Numpy还可以被用于一般数据处理的高效的多维容器。任意数据类型可以被定义。这使得Numpy能够与各种各样的数据库无缝,快速地整合

导入Numpy

1
import numpy as np

用Numpy创建数组

1
2
3
>>> a = np.array([[1,2,3],[2,3,4]])
>>> a
array([[1,2,3],[2,3,4]])

用Numpy创建矩阵

1
2
3
>>> a = np.matrix([[1,2,3],[3,4,5],[2,3,5]])
>>> print a
matrix([[1,2,3],[3,4,5],[2,3,5]])
  • 矩阵的乘积

    1
    2
    3
    4
    >>> a = np.matrix([[1,2,3],[3,4,5],[2,3,5]])
    >>> b = np.matrix([[2,4,5],[5,2,6],[3,7,9]])
    >>> print a*b
    matrix([[21 29 44],[41 55 84],[34 49 73]])
  • 求逆矩阵

    1
    2
    3
    >>> a = np.matrix([[1,2,3],[3,4,5],[2,3,5]])
    >>> print a**-1
    matrix([[-2.5 0.5 1. ],[ 2.5 0.5 -2. ],[-0.5 -0.5 1. ]])

使用dtype来获取或者设置数组元素的类型

获取

1
2
>>> a.dtype
dtype('int32')

设置

1
2
3
>>> a = np.array([1,2,3,4], dtype = float)
>>> print a
array([1.,2.,3.,4.])

通过方法生成数组

在上面的数组都是我们手工填充的,但是有些时候一些有规律的数组并不需要我们手工去填充

  • arange
    1
    2
    3
    >>> a = np.arange(0,6,2)
    >>> print a
    array([0,2,4])

0是起始值,6是结束值,2是步长,也就是每一次的增量

  • linspace
    1
    2
    3
    >>> a= np.linspace(0,1.5,3)
    >>> print a
    array([0.,0.75,1.5])

0是起始值,1.5是结束值,3是元素个数,相当于是在指定范围内生成一个等差数列,包含终值

arange生成的数组不包含终值,linspace生成的数组包含终值

  • logspace
    1
    2
    3
    >>> a = np.logspace(0,3,4)
    >>> print a
    array([1,10,100,1000])

logspace创建一个等比数列,0是10的0次方,3是10的3次方,4代表元素的个数

  • fromstring
    1
    2
    3
    4
    >>> s = "abcdef"
    >>> a = np.fromstring(s, dtype = np.int8)
    >>> print a
    array([97,98,99,100,101,102])

上面的例子中,我们将一个字符串,存入数组中,并将其转换为ascii码的形式,通过改变dtype还可以转化为其它形式,这里就不介绍了

其它的与fromstring相似的方法还有frombuffer和fromfile,fromfunction


数组的运算

  • 加减乘除
    1
    2
    3
    4
    5
    6
    >>> a = np.array([1,2,3])
    >>> print a+1
    array([2,3,4])
    >>> a = a+1
    >>> print a
    array([3,4,5])

可以看出矩阵支持直接运算和自增运算,运算的结果是矩阵中每个元素分别运算后的结果

  • 开平方根

    1
    2
    3
    4
    >>> a = np.array([1,4,9])
    >>> b = np.sqrt(a)
    >>> print b
    array([1,2,3])
  • 求和

    1
    2
    3
    >>> a = np.array([1,2,3,4])
    >>> print a.sum()
    10
  • 数组之间运算

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    >>> a = np.array([1,2,3])
    >>> b = np.array([2,3,4])
    >>> print a+b
    array([3,5,7])
    >>> print a*b
    array([2,6,12])
    >>> print a**2
    array([1,4,9])
    >>> print 1./a
    array([1,0.5,0.33333333])
    >>> print -a
    array([-1,-2,-3])

矩阵运算

  • dot(a,b)
1
2
3
4
5
>>> a= np.array([1,2,3])
>>> b = np.array([[1],[1],[1]])
>>> c = np.dot(a,b)
>>> print c
array([6])

可以看出dot()方法对两个矩阵进行了乘积运算,a是一个一行的矩阵,b是一个一列的矩阵,所以它们的乘积为一行一列的c

  • inner
1
2
3
4
5
6
>>> import numpy as np
>>> a = np.array([1,2,3])
>>> b = np.array([2,2,2])
>>> c = np.inner(a,b)
>>> print c
12 #1*2+2*2+3*2

结果为数组a和b对应下标的元素乘积的和

  • outer
    1
    2
    3
    >>> a = np.outer([1,2,3],[4,5,6,7])
    >>> print a
    array([4,5,6,7],[8,10,12,14],[12,15,18,21])

最终得到的结果是第一个数组中的每一个元素分别乘以后面的数组。也就是把第一个数组看成列矩阵后进行计算


对Numpy中.shape的理解

shape的意义
  • 一维数组的情况:
    1
    2
    3
    >>> a = np.array([1,2,3,4,5])
    >>> print a.shape
    5,)

我们可以看出,如果是一维数组的话,就只会出现一个数字,代表一维数组中元素的个数

  • 二维数组的情况:
    1
    2
    3
    >>> a = np.array([[1,2,3,4,5],[3,4,5,6,7]])
    >>> print a.shape
    (2,5)

显而易见,2代表的是二维数组的行数,5代表的是二维数组的列数

我们可以通过改变shape的值来改变数组
  • 通过把shape的一个值设为-1来改变数组的行列数
    1
    2
    3
    4
    >>> a = np.array([[1,2,3,4,5],[3,4,5,6,7]])
    >>> a.shape = 5,-1
    >>> print a
    array([[1,2],[3,4],[5,3],[4,5],[6,7]])

从上面可以看出,-1相当于是一个占位符,这个数组一共有10个元素,5是它的行数,那么-1自然就代表了10/5

如果 a.shape = -1,5 也同理可得

值得一提的是,在Numpy中还有一个属性叫reshape,利用该属性,可以在原来的数组的基础上通过改变行和列数来创建一个新的数组

1
2
3
4
5
6
7
8
9
10
11
>>> a = np.array([[1,2,3,4,5],[3,4,5,6,7]])
>>> print a
array([[1,2,3,4,5],[3,4,5,6,7]])
>>> b = a.reshape((5,2))
>>> print b
array([[1,2],[3,4],[5,3],[4,5],[6,7]])
>>> a[0] = 10
>>> print a
array([[10,2,3,4,5],[3,4,5,6,7]])
>>> print b
array([[10,2],[3,4],[5,3],[4,5],[6,7]])

从上面可以看出,b是在a的基础上,通过reshape方法得到的,同时我们发现了一个问题,如果我们改变a数组中某个元素的值,b中相应的位置的元素的值也会发生改变。这是为什么呢?这是因为a数组和b数组实际上是共用的同一块数据存储区域,通过a或者b改变该区域数据的值,都会影响使用该数据区域的其它对象

最后更新: 2018年01月24日 20:47

原始链接: http://drac0nids.top/2018/01/24/Numpy总结/

× 请我吃糖~
打赏二维码