Python数据清洗:Numpy常用操作

我为什么要用NumPy?

  • 对于同样的数值计算任务,使用NumPy要比直接编写Python代码便捷得多;
  • NumPy中的数组的存储效率和输入输出性能均远远优于Python中等价的基本数据结构,且其能够提升的性能是与数组中的元素成比例的;
  • NumPy的大部分代码都是用C语言写的,其底层算法在设计时就有着优异的性能,这使得NumPy比纯Python代码高效得多
  • 当然,NumPy也有其不足之处,由于NumPy使用内存映射文件以达到最优的数据读写性能,而内存的大小限制了其对TB级大文件的处理;此外,NumPy数组的通用性不及Python提供的list容器。因此,在科学计算之外的领域,NumPy的优势也就不那么明显。

关于Python Numpy矩阵的用法总结请参考博文:https://www.cnblogs.com/wj-1314/p/10244807.html


什么是NumPy?(基础篇)

NumPy是一个功能强大的Python库,主要用于对多维数组执行计算。NumPy这个词来源于两个单词– NumericalPython 。NumPy提供了大量的库函数和操作,可以帮助程序员轻松地进行数值计算。这类数值计算广泛用于以下任务:

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

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

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

NumPy的安装

在你的计算机上安装NumPy的最快也是最简单的方法是在shell上使用以下命令:pip install numpy

这将在你的计算机上安装最新/最稳定的NumPy版本。通过PIP安装是安装任何Python软件包的最简单方法。现在让我们来谈谈NumPy中最重要的概念,NumPy数组。

Numpy的使用以及应用

  • 导入Numpy模块

  • 使用np.array()创建

  • 使用plt 创建

  • 使用np的routines函数创建

  • 使用array()创建一个一维数组

import numpy as np
arr = np.array([1,2,3])
arr
array([1, 2, 3])
  • 使用array()创建一个多维数组
arr = np.array([[1,2,3],[4,5,6]])
arr
array([[1, 2, 3],
       [4, 5, 6]])
  • 数组和列表的区别是什么?
    • 数组中存储的数据元素类型必须是统一类型
    • 优先级:
      • 字符串 > 浮点型 > 整型
arr = np.array([1,2.2,"three"])
arr
array(['1', '2.2', 'three'], dtype='<U32')
  • 将外部的一张图片读取加载到numpy数组中,然后尝试改变数组元素的数值查看对原始图片的影响
import matplotlib.pyplot as plt
img_arr = plt.imread("C:\\Users\\图片.jpg") #返回的数组,数组中装载的就是图片内容
plt.imshow(img_arr)#将numpy数组进行可视化展示
<matplotlib.image.AxesImage at 0x2204a526cd0>

png

img_arr = img_arr - 100 #将每一个数组元素都减去100
plt.imshow(img_arr)
<matplotlib.image.AxesImage at 0x2204d86c690>

png

  • zero()
  • ones()
  • linespace()
  • arange()
  • random系列
np.ones(shape=(3,4))
array([[1., 1., 1., 1.],
       [1., 1., 1., 1.],
       [1., 1., 1., 1.]])
np.linspace(0,100,num=20)#一维的等差数列数组
array([  0.        ,   5.26315789,  10.52631579,  15.78947368,
        21.05263158,  26.31578947,  31.57894737,  36.84210526,
        42.10526316,  47.36842105,  52.63157895,  57.89473684,
        63.15789474,  68.42105263,  73.68421053,  78.94736842,
        84.21052632,  89.47368421,  94.73684211, 100.        ])
np.arange(10,50,step=2)#一维等差数列
array([10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42,
       44, 46, 48])
np.random.randint(0,100,size=(5,3))
array([[93, 62, 92],
       [13, 20, 45],
       [ 7, 65, 87],
       [98, 23, 74],
       [69, 18, 37]])

numpy的常用属性

  • shape
  • ndim
  • size
  • dtype
arr = np.random.randint(0,100,size=(5,6))
arr
array([[78, 21, 12, 74, 84, 52],
       [84, 57, 31, 61, 42, 10],
       [60, 52, 95, 45, 19, 35],
       [18, 31, 23, 21, 66, 21],
       [89, 40, 84,  5, 47, 13]])
arr.shape #返回的是数组的形状
(5, 6)
arr.ndim #返回的是数组的维度
2
arr.size #返回数组元素的个数
30
arr.dtype #返回的是数组元素的类型
dtype('int32')
type(arr) #数组的数据类型
numpy.ndarray
arr = np.array([1,2,3])
arr.dtype
dtype('int32')
#创建一个数组,指定数组元素类型为int64
arr = np.array([1,2,3],dtype="int64")
arr.dtype
dtype('int64')
arr.dtype = "uint8" #修改数组的元素类型
arr.dtype
dtype('uint8')

numpy的索引和切片操作(重点)

  • 索引操作和列表同理
arr = np.random.randint(1,100,size=(5,6))
arr
array([[94, 45,  2, 65, 25, 61],
       [11, 45, 70, 66, 94, 85],
       [32, 14, 90, 27, 32, 73],
       [34, 32, 47, 74, 81, 69],
       [42, 90, 73, 51, 20, 56]])
arr[1] #取出了numpy数组中的下标为1的行数据
array([11, 45, 70, 66, 94, 85])
arr[[1,3,4]] #取出多行
array([[11, 45, 70, 66, 94, 85],
       [34, 32, 47, 74, 81, 69],
       [42, 90, 73, 51, 20, 56]])
  • 切片操作
    • 切出前两行数据
    • 切出前两列数据
    • 切出前两行的前两列数据
    • 数组数据翻转
    • 练习:将一张图片上下左右进行翻转操作
    • 练习:将图片进行指定区域的裁剪
#切出arr数组的前两行的数据
arr[0:2] #arr[行切片]
array([[94, 45,  2, 65, 25, 61],
       [11, 45, 70, 66, 94, 85]])
#切出arr数组的前两列数据
arr[:,0:2] #arr[行切片,列切片]
array([[94, 45],
       [11, 45],
       [32, 14],
       [34, 32],
       [42, 90]])
#切出前两行的前两列数据
arr[0:2,0:2]
array([[94, 45],
       [11, 45]])
#将数组的行倒置
arr[::-1]
array([[42, 90, 73, 51, 20, 56],
       [34, 32, 47, 74, 81, 69],
       [32, 14, 90, 27, 32, 73],
       [11, 45, 70, 66, 94, 85],
       [94, 45,  2, 65, 25, 61]])
#将数组的列倒置
arr[:,::-1]
array([[61, 25, 65,  2, 45, 94],
       [85, 94, 66, 70, 45, 11],
       [73, 32, 27, 90, 14, 32],
       [69, 81, 74, 47, 32, 34],
       [56, 20, 51, 73, 90, 42]])
#所有元素倒置
arr[::-1,::-1]
array([[56, 20, 51, 73, 90, 42],
       [69, 81, 74, 47, 32, 34],
       [73, 32, 27, 90, 14, 32],
       [85, 94, 66, 70, 45, 11],
       [61, 25, 65,  2, 45, 94]])
#图片翻转前置准备
img_arr = plt.imread("C:\\Users\\图片.jpg")
plt.imshow(img_arr)
<matplotlib.image.AxesImage at 0x2204d7a3690>

png

img_arr.shape
(1024, 1024, 3)
#将一张图片左右进行翻转操作
plt.imshow(img_arr[:,::-1,:]) #img_arr[行,列,颜色]
<matplotlib.image.AxesImage at 0x2204f886690>

png

#将一张图片上下进行翻转操作
plt.imshow(img_arr[::-1,:,:])
<matplotlib.image.AxesImage at 0x2204f629a90>

png

#图片裁剪的功能
plt.imshow(img_arr[200:1000,250:800,:])
<matplotlib.image.AxesImage at 0x2204fdc81d0>

png

变形reshape

arr #原始arr是一个5行6列的二维数组
array([[94, 45,  2, 65, 25, 61],
       [11, 45, 70, 66, 94, 85],
       [32, 14, 90, 27, 32, 73],
       [34, 32, 47, 74, 81, 69],
       [42, 90, 73, 51, 20, 56]])
#将二维的数组变成1维
arr_1 = arr.reshape((30,))
#将1维变形成多维
arr_1.reshape((6,5))
array([[94, 45,  2, 65, 25],
       [61, 11, 45, 70, 66],
       [94, 85, 32, 14, 90],
       [27, 32, 73, 34, 32],
       [47, 74, 81, 69, 42],
       [90, 73, 51, 20, 56]])

级联操作

  • axis轴向的理解(将多个numpy数组进行横向或者纵向的拼接)
    • 0:列
    • 1:行
  • 问题:
    • 级联的两个数组维度一样,但是行列个数不一样会如何?(不行,链接的两个数组维度必须完全匹配)
np.concatenate((arr,arr),axis=1)
array([[94, 45,  2, 65, 25, 61, 94, 45,  2, 65, 25, 61],
       [11, 45, 70, 66, 94, 85, 11, 45, 70, 66, 94, 85],
       [32, 14, 90, 27, 32, 73, 32, 14, 90, 27, 32, 73],
       [34, 32, 47, 74, 81, 69, 34, 32, 47, 74, 81, 69],
       [42, 90, 73, 51, 20, 56, 42, 90, 73, 51, 20, 56]])
arr3 = np.concatenate((img_arr,img_arr,img_arr),axis=0)
plt.imshow(arr3)
<matplotlib.image.AxesImage at 0x2205118d290>

png

常用的聚合操作

  • sum,max,min,mean
arr
array([[94, 45,  2, 65, 25, 61],
       [11, 45, 70, 66, 94, 85],
       [32, 14, 90, 27, 32, 73],
       [34, 32, 47, 74, 81, 69],
       [42, 90, 73, 51, 20, 56]])
arr.sum(axis=1)
array([292, 371, 268, 337, 332])
arr.max(axis=1)
array([94, 94, 90, 81, 90])

常用的数学函数

  • Numpy提供了标准的三角函数:sin() cos() tan()
  • numpy.around(a,decimals)函数返回指定数字的四舍五入值
    • 参数说明:
      • a:数组
      • decimals:舍入的小数位数,默认值为0,如果为负,整数将四舍五入到小数点左侧的位置
np.sin(arr)
array([[-0.24525199,  0.85090352,  0.90929743,  0.82682868, -0.13235175,
        -0.96611777],
       [-0.99999021,  0.85090352,  0.77389068, -0.02655115, -0.24525199,
        -0.17607562],
       [ 0.55142668,  0.99060736,  0.89399666,  0.95637593,  0.55142668,
        -0.67677196],
       [ 0.52908269,  0.55142668,  0.12357312, -0.98514626, -0.62988799,
        -0.11478481],
       [-0.91652155,  0.89399666, -0.67677196,  0.67022918,  0.91294525,
        -0.521551  ]])
np.around(3.14,2)
3.14

常用的统计函数

  • numpy.amin()和numpy.amax(),用于计算数组中的元素沿指定轴的最小、最大值
  • numpy.ptp(),计算数组中元素最大值与最小值的差(最大值-最小值)
  • numpy.median()函数用于计算数组a中元素的中位数(中值)
  • 标准差std():标准差是一组数据平均分散程度的一种度量
  • 方差var():统计中的方差(样本方差)是每个样本值与全体样本值的平均数之差的平方值的平均数,换句话说,标准差是方差的平方根
np.ptp(arr,axis=0)
array([83, 76, 88, 47, 74, 29])
arr[1].std()
27.455519582691487
arr[1].var()
753.8055555555557

矩阵相关

  • 矩阵库numpy.matlib
  • numpy.matlib.identity()函数返回给定大小的单位矩阵
#eye返回一个标准的对角矩阵
np.eye(6)
array([[1., 0., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0., 0.],
       [0., 0., 1., 0., 0., 0.],
       [0., 0., 0., 1., 0., 0.],
       [0., 0., 0., 0., 1., 0.],
       [0., 0., 0., 0., 0., 1.]])
  • 转置矩阵 .T
arr.T
array([[94, 11, 32, 34, 42],
       [45, 45, 14, 32, 90],
       [ 2, 70, 90, 47, 73],
       [65, 66, 27, 74, 51],
       [25, 94, 32, 81, 20],
       [61, 85, 73, 69, 56]])

矩阵相乘

  • numpy.dot(a,b,out=None)
    • a:ndarray数组
    • b:ndarray数组
a1 = np.array([[2,1],[4,3]])
a2 = np.array([[1,2],[1,0]])
np.dot(a1,a2)
array([[3, 4],
       [7, 8]])