永无止境的假期--之numpy篇

2020/04/16 休息

Posted by WangXiaoDong on April 16, 2020
    今年,最长的一个假期。在家把线性代数,高等数学,概率统计又复习了一遍,
    顺便还在阿里公开课上找到了很多视频,就把python进行数据处理的所有内容
    全部看了一遍,之后又把Linux系统操作学习了一遍,最近准备刷第二遍,然后
    顺便把所有内容总结下来~

最近,在网上学习了一下阿里出品的人工智能学习路线系列。收获很大,需要总结一下。

今天总结python数据处理三剑客numpy,pandas,matplotlib之一的——numpy

Numpy学习

Numpy的名字实际上有两个部分构成,即:Numpy=num+py

  • num-numerical 数值化的
  • py-python

该库提供了一个N维数组类型ndarray,即:ndarray=n+d+array

  • n-任意个
  • d-dimension 维度
  • array-数组

其支持常见的数组和矩阵操作,因此对于同样的数值计算任务,使用Numpy要比直接使用Python要简洁的多!

首先,是这次学习的主要流程图: pic1

1. Numpy的优势

学习一个库之前,我们要了解为啥要使用这个库,它有什么优势呢?这样能提高我们的学习动力。

我们做一个测试:

import numpy as np
import random
import time
#生成一个大数组
python_list = []
for i in range(100000000):
    python_list.appent(random.random())
ndarray_list = np.array(python_list)
# 原生pythonlist求和
t1 = time.time()
a = sum(python_list)
t2 = time.time()
consume1 = t2 - t1

# ndarray 求和
t3 = time.time()
b = np.sum(ndarray_list)
t4 = time.time()
consume2 = t4 - t3

print('python原生数组求和消耗时间是ndarray求和消耗时间的%s倍。'% str(consume2/consume1))

为什么会这样呢?听我细细道来。

1.1 内存块风格

ndarray - 类型相同,通用性不强 list - 类型不同,通用性强

使用list虽然通用性强,但是其内部存的是引用方式,元素之间的并不是连续存放的,因此在查找的时候没有ndarray高。

1.2 支持并行化运算

ndarray支持向量化运算

1.3 底层语言

底层是C语言实现的,内部解除了GIL(全局解释器锁),其对数组的操作不受Python解释器的限制,效率远高于纯Python代码。

2. ndarray的属性

2.1 最重要属性

  • shape————形状
    • ndim——维度
    • size——元素个数
  • dtype————类型
    • itemsize———一个类型所占用的字节大小

创建ndarray时,没有指定类型时,默认:

  • 整数 int64
  • 浮点数 float64

3. 基本操作

主要以下两种形式进行操作:

  • ndarray.方法()
  • np.函数()

3.1 生成数组的方法

3.1.1 生成0和1的数组
np.zeros(shape)
np.ones(shape)
3.1.3 从现有数组中生成
深拷贝:
np.array()
np.copy()
浅拷贝:
np.asarray()
3.1.3 生成固定范围数组
np.linspace(0,10,100) -- 0到10等距离100个
np.arange(a,b,c) --- c是步长
3.1.4 生成随机数

np.random模块

  • 均匀分布
    • np.random.rand(d0,d1,d2……dn) 通过本函数可以返回一个或一组服从“0~1”均匀分布的随机样本值。随机样本取值范围是[0,1),不包括1。 1)当函数括号内没有参数时,则返回一个浮点数; 2)当函数括号内有一个参数时,则返回秩为1的数组,不能表示向量和矩阵; 3)当函数括号内有两个及以上参数时,则返回对应维度的数组,能表示向量或矩阵;
    • np.random.uniform(low= , high= , size= ):生成均匀分布在low到high的size个数的数组
  • 正态分布
    • np.random.randn(0,d1,d2……dn) 类似均匀分布
    • np.random.normal(loc= , scale= , size) 类似均匀分布

3.2 切片索引

直接对应维度操作跟python普通列表一样!

3.3 形状修改

  • ndarray.reshape(shape) 返回新的,原始数据没有变
  • ndarray.resize(shape) 无返回,原始数据变了
  • ndarray.T 返回新的,原始数据没有变

3.4 类型修改

ndarray.astype(np.type/'Type str')
ndarray.tostring() - 转换成byte返回

3.5 数组去重

np.unique()
或
set(ndarray.flatten())

4. 运算

4.1 逻辑运算

  • 布尔索引 比如找到所有大于一个数的数据: ndarray[ndarray > 需要的数] 显然python原生list只能用for循环实现

  • 通用判断函数
    • np.all(布尔值) 只要有一个False就返回False,只有全是True才返回True
    • np.any() 只要有一个True就返回True,只有全是False才返回False
  • 三元运算符 np.where(a,b,c) a是一个位置的布尔值,True为b,False为c

4.2 统计运算

4.2.1 统计指标

min,max,mean,median,var,std

  • np.~()
  • ndarray.~()

~代表上面的min,max etc. 注意使用时,axis要指定清楚!

4.2.2 最大、小值所在位置

np.argmax(ndarray,axis=)
np.argmin(ndarray,axis=)

4.3 数组间运算

  • 数组与数的运算 ndarray +/-/*/除 number 直接每个元素进行运算

  • 数组与数组的运算 下面重点介绍!

4.3.1 广播机制

  • 维度相同
Image(3d array) (256,256,3)
Scale(1d array)
Result(3d array) (256,256,3)

A   9, 1, 7, 1
B      8, 1, 5
Re  9, 8, 7, 5

上述中(8,1)(7,1)(1,5)均有一个是1

  • shape(其中相对应的一个地方为1)

4.4 矩阵运算

同线性代数
np.matmul()
np.dot()

5. 合并和分割

  • 合并
np.hstack()
np.vstack()
np.concatenate()
  • 分割 np.split()