详解Numpy中的数组
phpren · 143浏览 · 发布于2021-12-17 +关注

NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

Numpy定义

NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。NumPy 通常与 SciPy(Scientific Python)和 Matplotlib(绘图库)一起使用,这种组合广泛用于替代 MatLab,是一个强大的科学计算环境,有助于我们通过 Python 学习数据科学或者机器学习。

NumPy 主要应用包括:

机器学习模型:在编写机器学习算法时,需要对矩阵进行各种数值计算。例如矩阵乘法、换位、加法等。NumPy提供了一个非常好的库,用于简单(在编写代码方面)和快速(在速度方面)计算。NumPy数组用于存储训练数据和机器学习模型的参数。

图像处理和计算机图形学:计算机中的图像表示为多维数字数组。NumPy成为同样情况下最自然的选择。实际上,NumPy提供了一些优秀的库函数来快速处理图像。例如,镜像图像、按特定角度旋转图像等。

数学任务:NumPy对于执行各种数学任务非常有用,如数值积分、微分、内插、外推等。因此,当涉及到数学任务时,它形成了一种基于Python的MATLAB的快速替代。

为什么要用numpy

Python中提供了list容器,可以当作数组使用。但列表中的元素可以是任何对象,因此列表中保存的是对象的指针,这样一来,为了保存一个简单的列表[1,2,3]。就需要三个指针和三个整数对象。对于数值运算来说,这种结构显然不够高效。Python虽然也提供了array模块,但其只支持一维数组,不支持多维数组(在TensorFlow里面偏向于矩阵理解),也没有各种运算函数。因而不适合数值运算。NumPy的出现弥补了这些不足。(——摘自张若愚的《Python科学计算》)

详情请参考:

https://numpy.org/doc/stable/index.html

NumPy安装

因为numpy通常跟 scipy matplotlib一起使用,所以一起安装三个模块即可

pip3 install --user numpy scipy matplotlib

numpy array基础使用

np数组的创建

import numpy as np 
a = np.array([1,2,3,4]),#1行4列矩阵,即一维数组 
b = np.arange(4) # 1行4列矩阵,元素递增1的一维数组 
c = np.array([[1,2],[3,4]]) # 2行2列矩阵,即二维数组d = np.arange(4).reshape((2,2)) #变换输出 2行2列print (a) 
print(type(a)) #输出a的类型print (b) 
print (c) 
print (d)

    分别输出:

    [1 2 3 4] 
    [0 1 2 3] 
    [[1 2] 
    [3 4]] 
    [[0 1] 
    [2 3]]

      np数组的广播

      广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式,对数组的算术运算通常在相应的元素上进行。如果两个数组 a 和 b 形状相同,即满足a.shape == b.shape,那么 a*b 的结果就是 a 与 b 数组对应位相乘。这要求维数相同,且各维度的长度相同。

      例如代码

      a = np.array([1,2,3]) 
      b = np.array([10,20,30]) 
      c = a * b 
      print (c)

        输出

        [10 40 90]

          数组广播相加操作

          a = np.array([[ 0, 0, 0], [10,10,10], [20,20,20], [30,30,30]]) #4x3 的二维数组 
          b = np.array([1,2,3]) 
          print(a + b)

            输出

            [[11 12 13] 
            
            [2122 23]]

              下面的图片展示了数组 b 如何通过广播来与数组 a 兼容。4x3 的二维数组与长为 3 的一维数组相加,等效于把数组 b 在二维上重复 4 次再运算:

              详解numpy中的数组(附源码)

              np数组的切片和索引

              ndarray对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样。ndarray数组可以基于0-n的下标进行索引,切片对象可以通过内置的 slice 函数,并设置 start, stop 及 step 参数进行,从原数组中切割出一个新数组。相信大家理解python list切片相关操作,一定会对该部分的内容感到熟悉,这里举几个经典的例子:

              基础实例

              import numpy as np 
              a = np.arange(10) # [0 1 2 3 4 5 6 7 8 9] 
              b = a[5] #下标5元素的值 
              c = np.array([[1,2,3],[3,4,5],[6,7,8]])print(b) 
              print(a[3:5]) #输出下标3-5的值,注意这里可以输出下限3,而不包括上限5 
              print(c[0,0]) #输出第一行第一列的元素即[1,2,3]中的1 
              print (c[...,1]) #第2列元素print (c[1,...]) # 第2行元素print (c[...,1:]) # 第2列及剩下的所有元素

                输出

                5 
                [3 4] 
                1 
                [2 4 7] 
                [3 4 5] 
                [[2 3] 
                [45] 
                [78]]

                  布尔索引实例

                  我们可以通过一个布尔数组来索引目标数组。布尔索引通过布尔运算(如:比较运算符)来获取符合指定条件的元素的数组。

                  c = np.array([[1,2,3],[3,4,5],[6,7,8]]) 
                  print (c[c > 3]) #打印出大于3的元素

                    输出

                    [4 5 6 7 8]

                      numpy array遍历

                      直接上代码,普通一维数组

                      arr = np.array([1, 2, 3]) 
                      for x in arr: 
                          print(x)

                        输出

                        1 
                        2 
                        3

                          定义一个numpy的二维数组,二维以上的数组这里不做讨论

                          arr = np.array([[1, 2, 3], [4, 5, 6]]) 
                          #遍历 
                          for x in arr: 
                               print(x)

                            输出

                            [1 2 3] 
                            [4 5 6]

                              如果想一个一个地输出每一个元素,可以这样编写代码

                              for x in arr: 
                                   for y in x: 
                                         print(y)

                                输出

                                1 
                                2 
                                3 
                                4 
                                5 
                                6

                                  上面的方式比较麻烦,我们可以通过方法np.nditer实现一个一个地输出每一个元素

                                  for x in np.nditer(arr): 
                                       print(x)

                                    输出

                                    1 
                                    2 
                                    3 
                                    4 
                                    5 
                                    6

                                      numpy array元素过滤

                                      实例,在np数组中,过滤大于2的元素

                                      arr = np.array([1, 2, 3, 4]) 
                                      newarr = arr[arr >2] 
                                      print(newarr)

                                        输出

                                        [3 4]

                                          怎么样,是不是非常非常简单!

                                          numpy array 关于字符的处理

                                          如果np数组中存储的是字符,如果相对字符元素进行相关操作,需要使用api —np.char

                                          有这样一个需求,把字符'0.01%','1.1%','1.21%' 中的%去掉,并把字符转型为float类型。如何实现呢?代码如下:

                                          b=np.array(['0.01%','1.1%','1.21%']) 
                                          newb=np.char.rstrip(b,'%').astype(float) 
                                          print(newb)

                                            输出

                                            [0.01 1.1 1.21]

                                              其中:

                                              rstrip表示删除某个字符

                                              astype(float)表示把元素转型为float

                                               


                                              相关推荐

                                              PHP实现部分字符隐藏

                                              沙雕mars · 1077浏览 · 2019-04-28 09:47:56
                                              Java中ArrayList和LinkedList区别

                                              kenrry1992 · 533浏览 · 2019-05-08 21:14:54
                                              Tomcat 下载及安装配置

                                              manongba · 634浏览 · 2019-05-13 21:03:56
                                              JAVA变量介绍

                                              manongba · 730浏览 · 2019-05-13 21:05:52
                                              什么是SpringBoot

                                              iamitnan · 636浏览 · 2019-05-14 22:20:36
                                              加载中

                                              0评论

                                              评论
                                              我从小喜欢编程,一直在学习中,从未停止,未来也是如此!
                                              小鸟云服务器
                                              扫码进入手机网页