(一) numpy模块

 

Numpy模块

一.什么是数据分析

  简单来讲数据分析就是是把隐藏在一些看似杂乱无章的数据背后的信息提炼出来,总结出所研究对象的内在规律。在数据分析的学习过程中,我们主要围绕着被称为数据分析三剑客的这三个模块展开讲解,分别是Numpy模块、Pandas模块、Matplatlib模块。

二.Numpy模块

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

  创建Numpy

1. 使用np.array()函数创建

#导入numpy的包
import numpy as np
#创建一个基于一维numpy数组
np.array([1,2,3,4,5])
#创建一个基于二维numpy数组
np.array([[1,2,3],[4,'a',6],[6,7,8]])

注意:
- numpy默认ndarray的所有元素的类型是相同的
- 如果传进来的列表中包含不同的类型,则统一为同一类型,优先级:str>float>int 

- 创建一个numpy数组,数组的数据源来自于一张图片数据

#导入绘图模块
import matplotlib.pyplot as plt
#将图片数据进行加载,返回一个多维的numpy数组
img_arr = plt.imread('cat.jpg')
#将数组中的数据,用图形的方式进行展示
plt.imshow(img_arr)

2. 使用np的roustines函数创建

包含以下常见创建方法:
参数介绍:
    - shape表示数组的形状,类型为元组或列表
    - dtype表示数组元素的数据类型

1) np.ones(shape, dtype=None, order='C')创建一个形状为shape的数组,数组元素为1 
2) np.zeros(shape, dtype=None, order='C')创建一个形状为shape的数组,数组元素为0
3) np.full(shape, fill_value, dtype=None, order='C')创建一个形状为shape的数组,数组元素为fill_value
5) np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)创建一个一维数组,数组元素为等差数列
6) np.arange([start, ]stop, [step, ]dtype=None)创建一个一维数组
7) np.random.randint(low, high=None, size=None, dtype='l')创建一个形状为shape的数组,数组元素为随机值
8) np.random.randn(d0, d1, ..., dn)  标准正太分布
9) np.random.random(size=None)  生成0到1的随机数,左闭右开      

3. numpy的属性

  ndim:返回数组的维度数

  shape:返回一个元组,表示数组的形状

  size:返回数组长度

  dtype:返回数组元素的数据类型

4. numpy的索引操作:numpy的一维数组于python列表用法完全一致,多维同理

5. numpy的切片操作:numpy的一维数组于python列表用法完全一致,多维同理

#创建一个numpy数组
arr = np.random.randint(60,120,size=(6,4))
#获取该二维数组的前两行
arr[0:2]
#获取二维数组前两列
arr[:,0:2]   #,左边表示的是行,右边是列
#获取二维数组前两行和前两列数据
arr[0:2,0:2]
#将数组的行倒序
arr[::-1]
#列倒序
arr[:,::-1]
#全部倒序
arr[::-1,::-1]

使用切片将图片进行倒置操作

#加载图片数据到img_arr的numpy数组中
img_arr = plt.imread('./cat.jpg')
#查看该图片的形状
img_arr.shape #该属性返回的值为(456, 730, 3),表示该数组为三维。456和730表示的是该图片的像素,3表示图片的颜色
#展示该张图片
plt.imshow(img_arr)
#将该图片的进行上下左右倒置
plt.imshow(img_arr[::-1,::-1,:])

6. 变形操作:使用arr.reshape()函数,注意参数是一个tuple!

#将二维数组变形成一维数组
arr = np.array([[ 83, 105,  62,  94],
       [110, 111,  71,  64],
       [108,  91,  65,  73],
       [107, 101, 109, 106],
       [ 67, 101,  80, 113],
       [119,  74,  89, 109]])
#reshape的参数表示的是变形后数组的形状
new_arr = arr.reshape(6*4)
#将一维数组变形成三维数组
new_arr.reshape(2,4,3)

拓展:reshape(-1,2)表示将数组变形成二维数组,变形后的数组的列数为2,行数为-1,-1表示根据列数自动计算出行数

7. 级联操作:np.concatenate(),在numpy中,级联表示的是将多个numpy数组根据指定规则进行横向或者纵向的拼接操作。

arr = np.array([[ 83, 105,  62,  94],
       [110, 111,  71,  64],
       [108,  91,  65,  73],
       [107, 101, 109, 106],
       [ 67, 101,  80, 113],
       [119,  74,  89, 109]])
#将arr和arr进行级联操作。
#axis=0:轴向 0表示的是竖直的轴向 1水平的轴向
np.concatenate((arr,arr),axis=1)

#级联后返回的结果为:
array([[ 83, 105,  62,  94,  83, 105,  62,  94],
       [110, 111,  71,  64, 110, 111,  71,  64],
       [108,  91,  65,  73, 108,  91,  65,  73],
       [107, 101, 109, 106, 107, 101, 109, 106],
       [ 67, 101,  80, 113,  67, 101,  80, 113],
       [119,  74,  89, 109, 119,  74,  89, 109]])

不匹配级联:

#创建一个形状为3行4列的二维数组
arr1 = np.random.randint(0,100,size=(3,4))
#将arr和arr1进行纵向级联,arr的形状为6行4列
np.concatenate((arr,arr1),axis=0)

#接连后的结果为:
array([[ 83, 105,  62,  94],
       [110, 111,  71,  64],
       [108,  91,  65,  73],
       [107, 101, 109, 106],
       [ 67, 101,  80, 113],
       [119,  74,  89, 109],
       [ 47,  58,  97,  30],
       [ 16,  15,   4,  63],
       [  0,  15,  73,  95]])

#思考如果将arr1和arr进行横向级联会怎样呢?
np.concatenate((arr,arr1),axis=1) #会报错,因为两个数组的行数不一致,无法匹配级联。

np.hstack与np.vstack跟np.concatnate一样,都是用作于级联,只不过前两个方法的参数中午axis参数。hstack表示横向级联,vstack表示纵向级联

级联需要注意的点:

- 级联的参数是列表:一定要加中括号或小括号
- 维度必须相同
- 形状相符:在维度保持一致的前提下,如果进行横向(axis=1)级联,必须保证进行级联的数组行数保持一致。如果进行纵向(axis=0)级联,必须保证进行级联的数组列数保持一致。
- 可通过axis参数改变级联的方向

8. 切分

与级联类似,三个函数完成切分工作:
- np.split(arr,行/列号,轴):参数2是一个列表类型
- np.vsplit
- np.hsplit
#创建一个数组
np.random.seed(10)#固定时间种子,其作用为可以使得random产生的随机数固定下来
num_arr = np.random.randint(60,100,size=(5,6))
#将num_arr在列索引为2,3的位置进行切分,则原数组被切分成了三分
np.split(num_arr,[2,3],axis=1)
#将num_arr在行索引为2,3的位置进行切分,则原数组被切分成了三分
np.split(num_arr,[2,3],axis=0)

9. 副本:在numpy中,所有赋值运算不会为numpy数组的任何元素创建副本。对赋值后的对象的操作也对原来的对象生效。

arr = np.array([1,2,3,4,5])
#为arr创建了一个副本a
a = arr.copy()
#对a进行赋值操作,不会影响arr本身
a[1] = 10

10. numpy的聚合操作

Function   Name    NaN-safe Version    Description
np.sum    np.nansum    Compute sum of elements
np.prod    np.nanprod    Compute product of elements
np.mean    np.nanmean    Compute mean of elements
np.std    np.nanstd    Compute standard deviation
np.var    np.nanvar    Compute variance
np.min    np.nanmin    Find minimum value
np.max    np.nanmax    Find maximum value
np.argmin    np.nanargmin    Find index of minimum value
np.argmax    np.nanargmax    Find index of maximum value
np.median    np.nanmedian    Compute median of elements
np.percentile    np.nanpercentile    Compute rank-based statistics of elements
np.any    N/A    Evaluate whether any elements are true
np.all    N/A    Evaluate whether all elements are true
np.power 幂运算

11. 广播机制

【重要】ndarray广播机制的三条规则:
    规则一:为缺失的维度补1(进行运算的两个数组之间的维度只能相差一个维度)
    规则二:缺失元素用已有值填充
    规则三:缺失维度的数组只能有一行或者一列
根据广播机制三条准则,对如下案例进行练习:

例1:
m = np.ones((2, 3))
a = np.arange(3)
求m+a

例2:
a = np.arange(3).reshape((3, 1))
b = np.arange(3)
求a+b

12. 排序

np.sort()与ndarray.sort()都可以,但有区别:

    - np.sort()不改变输入
    - ndarray.sort()本地处理,不占用空间,但改变输入


np.partition(a,k)有的时候我们不是对全部数据感兴趣,我们可能只对最小或最大的一部分感兴趣。

当k为正时,我们想要得到最小的k个数
当k为负时,我们想要得到最大的k个数

 

posted @ 2019-06-29 10:19  tiger_li  阅读(816)  评论(0编辑  收藏  举报