Python的numpy库

作者: LiuShaodong | 来源:发表于2019-12-27 15:22 被阅读0次

numpy(numerical python)是一个开源的 Python 科学计算库,支持大量的数组与矩阵运算,并为其提供了大量的数学函数。numpy 是用 C 语言开发的,比 Python 的自带数据结构 Tuple、List、Dictionary 和 Set 都要快。另外 numpy 是属于 Python 的扩展程序库,也即是第三方库,所以以前没有安装 numpy 库的小伙伴们需要先安装 numpy。由于 numpy 库是一个科学计算库,所以在本篇我们将采用 Anaconda 中自带的 jupyter notebook 来给小伙伴们演示 numpy 的各种方法。如果有不了解 Anaconda 的小伙伴,可以先了解一下:https://www.jianshu.com/p/68f0565c7036

首先定义一个二维列表 arr(类型为List[List[int]]),然后通过 numpy 的 np.array 方法将 Python 列表 arr 转成 numpy 中的数组 arr1(类型为ndarray):

In [1]:  import numpy as np
         arr = [[1,2,3],[2,3,4]]
         arr1 = np.array(arr)
         arr1

Out [1]:  array([[1, 2, 3],
          [2, 3, 4]])

接着我们调用 size 函数查看 arr1 元素的个数:

In [2]:  print(arr1.size)

Out [2]: 6

然后我们可以通过 shape 函数查看 arr1 的形状:

In [3]:  print(arr1.shape)

Out [3]: (2, 3)

我们可以将 List 转成 ndarray,并指定 ndarray 元素的类型为 int:

In [4]:  a = np.array([2,42,11,3],dtype=np.int)
         print(a.dtype)

Out [4]: int64

同样地,我们也可以指定 ndarray元素类型为 float:

In [5]:  a = np.array([2,42,11,3],dtype=np.float)
         print(a.dtype)

Out [5]: float64

我们可以通过 zeros 函数填充一个3行4列的矩阵:

In [6]:  a = np.zeros((3,4)) 
         print(a)

Out [6]:  [[0. 0. 0. 0.]
          [0. 0. 0. 0.]
          [0. 0. 0. 0.]]

常用的还有使用 ones 函数填充矩阵:

In [7]:  a = np.ones((3,2),dtype=int) 
         print(a)

Out [7]:  [[1 1]
          [1 1]
          [1 1]]

使用 arange 函数生成一个10到20的数组,步长为2:

In [8]:  a = np.arange(10,20,2)
         print(a) 

Out [8]:  [10 12 14 16 18]

也可以使用 reshape 函数对 arange 生成的数组重新定义形状:

In [9]:  a = np.arange(12).reshape((3,4)) # np.arange(12) 表示生成一个从0到11的数组,共12个值,步长默认为1
         print(a)

Out [9]:  [[ 0  1  2  3]
          [ 4  5  6  7]
          [ 8  9 10 11]]

通过 linspace 函数可以切分数据:

In [10]:  a = np.linspace(1,10,5) #从1到10,切成5个段(区间)
          print(a)

Out [10]:  [ 1.    3.25  5.5   7.75 10.  ]

对数组按照元素进行 加减乘除:

In [11]:  a = np.array([10,20,30,40])
          b = np.array([1,2,3,4])
          c = np.arange(4) #不包括4,从0 到 3 共4个元素
          print(a-b) #两个数组中每个元素相减
          print(b+c) #两个数组中每个元素相加
          print(b**2) #数组b的平方
          print(a*b) # 两个数组相乘

Out [11]:  [ 9 18 27 36]
           [1 3 5 7]
           [ 1  4  9 16]
           [ 10  40  90 160]

random 函数可以生成0-1之间的随机数值:

In [12]:  a = np.random.random((2,4)) #2行4列的随机数(0-1)之间
          print(a)

Out [12]:  [[0.97164977 0.14426644 0.36158434 0.17456143]
           [0.04331342 0.18312231 0.2126627  0.17222228]]

我们可以通过 sum 函数、min 函数和 max 函数分别得到数组的各个元素的和,最小值和最大值:

In [13]:  print(np.sum(a)) #a的元素之和 
          print(np.min(a)) #a的最小值 
          print(np.max(a)) #a的最大值

Out [13]:  2.2633826930383676
           0.043313416357604995
           0.9716497706841624

另外,如果声明了 axis 参数,可以对数组的行或者列进行统计:

In [14]:  print(np.sum(a,axis=1)) # axis=1代表行
          print(np.sum(a,axis=0)) #  axis=0代表列

Out [14]:  [1.65206198 0.61132071]
           [1.01496319 0.32738875 0.57424704 0.34678372]

当然,也可以用 argmin 函数和 argmax 函数分别得到数组中最小值的索引和最大值的索引:

In [15]:  print(np.argmin(a)) #该矩阵最小值的索引 
          print(np.argmax(a)) #该矩阵最大值的索引

Out [15]:  4
           0

如果想输出数组中所有非0元素的角标,可以用 nonzero 函数:

In [16]:  print(np.nonzero(a)) #输出所有非0元素的角标

Out [16]:  (array([0, 0, 0, 0, 1, 1, 1, 1]), array([0, 1, 2, 3, 0, 1, 2, 3]))
                 注,第一个数组代表行号,第二个数组代表列号

arange 函数也能生成一个倒序数值的数组:

In [17]:  a = np.arange(11,-1,-1).reshape((3,4)) #arange包括第一个值,不包括第二个值的区间,11- -1 是从11到0,-1代表递减
          print(a)

Out [17]:  [[11 10  9  8]
           [ 7  6  5  4]
           [ 3  2  1  0]]

可以用 sort 函数对矩阵的每一行独立排序:

In [18]:  print(np.sort(a))

Out [18]:  [[ 8  9 10 11]
            [ 4  5  6  7]
            [ 0  1  2  3]]

在一些机器学习算法中,我们常常需要对矩阵进行转置运算:

In [19]:  print(np.transpose(a)) #矩阵a的转置

Out [19]:  [[11  7  3]
            [10  6  2]
            [ 9  5  1]
            [ 8  4  0]]

a.T 也同样可以得到矩阵 a 的转置:

In [20]:  print(a.T)

Out [20]:  [[11  7  3]
            [10  6  2]
            [ 9  5  1]
            [ 8  4  0]]

用矩阵a的转置乘以矩阵a也是常见的运算:

In [21]:  print((a.T).dot(a)) 

Out [21]:  [[179 158 137 116]
           [158 140 122 104]
           [137 122 107  92]
           [116 104  92  80]]

对训练数据预处理的时候,往往要对异常值进行特殊处理,例如,对于矩阵a,用数值9代替大于9的值,用5代替小于5的值:

In [22]:  print(np.clip(a,5,9))

Out [22]:  [[9 9 9 8]
            [7 6 5 5]
            [5 5 5 5]]

我们往往需要对矩阵中某一行或者某一列进行操作:

In [23]:  print(a[2,:]) #相当于取二维数组中角标为2的一整行
          print(a[:,1]) #相当于取二维数组中角标为1的一整列

Out [23]:  [3 2 1 0]
           [10  6  2]

迭代矩阵中的每一行:

In [24]:  for row in a:
             print(row)

Out [24]:  [11 10  9  8]
           [7 6 5 4]
           [3 2 1 0]

迭代矩阵的每一列,可以借助矩阵的转置操作:

In [25]:  for col in a.T:
             print(col)

Out [25]:  [11  7  3]
           [10  6  2]
           [9 5 1]
           [8 4 0]

用迭代器遍历矩阵的每一个元素:

In [26]:  for item in a.flat:
             print(item)
 
Out [26]:  11
           10
            9
            8
            7
            6
            5
            4
            3
            2
            1
            0

上下合并两个数组:

In [27]:  a = np.array([1,1,1])
          b = np.array([2,2,2])
          print(np.vstack((a,b))) #vertical stack 上下合并,把a和b作为两个元素 (a,b)为Tuple

Out [27]:  [[1 1 1]
            [2 2 2]]

左右合并两个数组:

In [28]:  print(np.hstack((a,b))) #horizontal stack 左右合并

Out [28]:  [1 1 1 2 2 2]

在数组上新增一个轴,变成矩阵:

In [29]:  print(a[:,np.newaxis]) #在列上新加一个轴  
          print(a[np.newaxis,:])  #在行上新加一个轴

Out [29]:  [[1]
            [1]
            [1]]
           [[1 1 1]]

我们可以通过新增加轴的方式将行向量转成列向量:

In [30]:  a = np.array([1,1,1])[:,np.newaxis]
          b = np.array([2,2,2])[:,np.newaxis]
          a,b

Out [30]:  (array([[1],
                   [1],
                   [1]]), array([[2],
                   [2],
                   [2]]))

hstack 函数和 concatenate 函数均能左右合并两个或多个列向量:

In [31]:  print(np.hstack((a,b,b)))
          print(np.concatenate((a,b,b),axis=1)) # axis表示左右合并

Out [31]:  [[1 2 2]
            [1 2 2]
            [1 2 2]]
           [[1 2 2]
            [1 2 2]
            [1 2 2]]

按照行的维度等量切割矩阵:

In [32]:  a = np.arange(12).reshape((3,4))
          print(a)
          print(np.split(a,3,axis=0)) # 矩阵a有3行,可以按照行切割成3块,除不尽会报错

Out [32]:  [[ 0  1  2  3]
            [ 4  5  6  7]
            [ 8  9 10 11]]
           [array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]

按照列的维度等量切割矩阵:

In [33]:  print(np.split(a,2,axis=1)) #有4列,可以分成两块 ,除不尽 会报错

Out [33]: [array([[0, 1],
                  [4, 5],
                  [8, 9]]), array([[ 2,  3],
                  [ 6,  7],
                  [10, 11]])] 

我们也可以按照需要不等量切割矩阵:

In [34]: print(np.split(a,[1,1,2],axis=1)) # 按照(1,1,2)的方式对矩阵a进行按照列的维度切割

Out [34]:  [array([[0],
                   [4],
                   [8]]), array([], shape=(3, 0),             dtype=int64), array([[1],
                   [5],
                   [9]]), array([[ 2,  3],
                   [ 6,  7],
                   [10, 11]])]

另一种切割的方法:

In [35]:  print(np.vsplit(a,3)) #上下切分
          print(np.hsplit(a,2)) #左右切分

Out [35]:  [array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]
           [array([[0, 1],
                   [4, 5],
                   [8, 9]]), array([[ 2,  3],
                   [ 6,  7],
                   [10, 11]])]

本篇到这里就要结束了,以上就是我在工作学习中,用到的常见的 numpy 库方法,小伙伴们想了解更多的 Python 知识,可以关注我的简书哦!

相关文章

网友评论

    本文标题:Python的numpy库

    本文链接:https://www.haomeiwen.com/subject/drxdoctx.html