Karen


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 搜索

排序的几种算法

发表于 2018-09-10

###关于排序算法的问题梳理:

​ 衡量一个算法的好坏有两个指标:渐近时间复杂度和渐近空间复杂度

  • 第一类:简单排序算法 - 简单选择排序、简单插入排序、冒泡排序 - O(n ** 2)
  • 第二类:高级排序算法 - 快速排序、归并排序 - O(n * log2 n)

本文主要介绍冒泡排序和归并排序

####冒泡排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
"""
68, 34, 12, 95, 73, 80, 57
34, 12, 68, 73, 80, 57, 95
12, 34, 68, 73, 57, 80
12, 34, 68, 57, 73
12, 34, 57, 68
12, 34, 57
12, 34
"""

def bubble_sort(unsorted_items, *, comp=lambda x, y: x > y):
"""冒泡排序"""
items = unsorted_items[:]
items_len = len(items)
for i in range(items_len - 1):
swapped = False
for j in range(items_len - 1 - i):
if comp(items[j], items[j + 1]):
items[j], items[j + 1] = items[j + 1], items[j]
swapped = True
if swapped:
swapped = False
for j in range(items_len - 2 - i, 0, -1):
if comp(items[j - 1], items[j]):
items[j], items[j - 1] = items[j - 1], items[j]
swapped = True
if not swapped:
break
return items


# class Student():
#
# def __init__(self, name, age):
# self.name = name
# self.age = age
#
# def __repr__(self):
# return f'{self.name}: {self.age}'
#
# def __gt__(self, other):
# return self.age > other.age
# 使用namedtuple可以更简洁的生成类
Student = namedtuple('Student', ('name', 'age'))


def main():
"""主函数"""
items = [
Student('Luo Hao', 38), Student('Wang Dachui', 19),
Student('Lee Xiaolong', 25), Student('Zhang Sanfeng', 120)
]
print(bubble_sort(unsorted_items=items,
comp=lambda x, y: x.age > y.age))
items2 = ['pitaya', 'pear', 'apple', 'watermelon', 'waxberry']
print(bubble_sort(items2, comp=lambda x, y: len(x) > len(y)))


if __name__ == '__main__':
main()

归并排序

​ 通过分解再重组来排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
"""
68, 34, 12, 95, 73, 80, 57
[69, 34, 12], [95, 73, 80, 57]
[69], [34, 12], [95, 73], [80, 57]
[69], [34], [12], [95], [73], [80], [57]
----------------------------------------
[34, 69], [12, 95], [73, 80], [57]
[12, 34, 69, 95], [57, 73, 80]
[12, 34, 57, 69, 73, 80, 95]
"""
# 分治法 - 将规模较大的问题划分为规模较小的子问题 用子问题解合并出原问题的解
# divide-and-conquer
def merge_sort(unsorted_items, *, comp=lambda x, y: x < y):
if len(unsorted_items) <= 1:
return unsorted_items[:]
mid = len(unsorted_items) // 2
left = merge_sort(unsorted_items[:mid], comp=comp)
right = merge_sort(unsorted_items[mid:], comp=comp)
return merge(left, right, comp=comp)


def merge(list1, list2, *, comp=lambda x, y: x < y):
"""将两个有序列表合并 合并之后仍然有序"""
list3 = []
index1, index2 = 0, 0
while index1 < len(list1) and index2 < len(list2):
if comp(list1[index1], list2[index2]):
list3.append(list1[index1])
index1 += 1
else:
list3.append(list2[index2])
index2 += 1
list3 += list1[index1:]
list3 += list2[index2:]
return list3

def main():
"""主函数"""
items3 = [68, 34, 12, 95, 73, 80, 57]
print(merge_sort(items3))


if __name__ == '__main__':
main()

分治法:分而治之,将大问题拆解

所以能用循环的地方都不用递归

例子:小孩走楼梯

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 爬楼梯 一次可以爬1个、2个、3个台阶
# 爬完10个台阶一共有多少种走法
def walk(num, result={}):
if num == 0:
return 1
elif num < 0:
return 0
try:
return result[num]
except KeyError:
result[num] = walk(num - 1) + walk(num - 2) + walk(num - 3)
return result[num]

def main():
for num in range(1, 11):
print(f'{num}: {walk(num)}')


if __name__ == '__main__':
main()

例子2:斐波拉契数列的两种解法

1
2
3
4
def factorial(num):
if num in (0, 1):
return 1
return num * factorial(num - 1)

斐波拉契优化:

动态规划优化

​ 将求解的中间值储存起来,牺牲空间换取时间

使用动态规划算法,求解的问题有局部最优解或者最优字结构,(把每一次的结果保存下来)
1
2
3
4
5
6
7
8
9
10
# 1 1 2 3 5 8 13 21 34 55 ...
# 动态规划 - 求解的问题有局部最优解或者最优子结构
def fib2(num, result={}):
if num in (1, 2):
return 1
try:
return result[num]
except KeyError:
result[num] = fib2(num - 1) + fib2(num - 2)
return result[num]

在Linux系统中安装软件的几种方式

发表于 2018-09-05

mysql数据库CRUD-3

发表于 2018-09-01

本文主要介绍select相关内容

问题:查找年龄最大最小学生,并显示名字

查询语句

查询所有学生信息

1
2
select * from tb_student;
select * from tb_course;

笛卡尔积

1
select * from tb_student, tb_course;

投影和别名:

给字段别名
1
select sname 姓名, ssex 性别 from tb_student;

#####给查询出来的记录别名

1
select sname as 姓名, case ssex when 1 then '男' else '女' end as 性别 from tb_student;

​ 这种写法通用型更强,适合多种数据库

1
select sname as 姓名, if(ssex, '男', '女') as 性别 from tb_student;

​ if是mysql数据库独有的写法

筛选:

= / <> / > / >= / < / <= / is null / is not null

between and / and / or / not

查询所有女学生的姓名和出生日期

  1. 查询所有的女学生(筛选条件)
1
select sname, sbirth from tb_student where ssex=0;
  1. 查询学分大于两个学分的课程
1
select courseid, cname from tb_course where ccredit>2;

范围筛选:

查询所有80后学生的姓名、性别和出生日期

  1. and
1
2
3
select sname, ssex, sbirth from tb_student 

where sbirth>='1980-1-1' and sbirth<='1989-12-31';
  1. between
1
2
3
select sname, ssex, sbirth from tb_student 

where sbirth between '1980-1-1' and '1989-12-31';

模糊查询:

通配符(wildcard): % / _

  • %:代表0个或任意多个字符
    • %x%:代表包含x这个字符的项
  • _:精准的匹配一个字符

    查询姓杨的学生姓名和性别
    

回顾:精确查找杨过

1
select * from tb_student where sname='杨过';

#####模糊查询姓杨的学生

1
select * from tb_student where sname like '杨%';
模糊查询: 查询姓杨名字总共两个字的学生的姓名
1
select * from tb_student where sname like '杨_';

#####模糊查询: 查询姓杨名字总共三个字的学生的姓名

1
select * from tb_student where sname like '杨__';

#####模糊查询: 查询名字中有杨字的学生的姓名(模糊)

1
select * from tb_student where sname like '%杨%';

#####使用正则表达式

1
select stuid, sname, ssex from tb_student where sname regexp '^[张李].+';

^:开始匹配位置

.:任意字符

+:一个或多个

多条件和空值处理:

查询没有录入生日或家庭住址的学生姓名
在判断一个列是否为null的时候不能用=或<>而要使用is或者is not

1
select * from tb_student where sbirth is null or saddr is null;

判断为空值:is null

判断不为空值:is not null

去重查询:

​ 查询学生的籍贯

查询出所有未清洗的学生的籍贯

1
select saddr from tb_student;

去掉空值

1
select saddr from tb_student where saddr is not null;

去重(disdinct)

1
select distinct saddr from tb_student where saddr is not null;

排序

#####asc(升序-从小到大) / desc(降序-从大到小)

第一排序关键字:第一个给出的排序的字段,首要保证的排序依据,如果第一排序关键字排不出来再按照第二排序关键字排序

把女生排前面

1
select * from tb_student order by ssex;

默认是asc升序排列,因为女生的0比男生的1小,所以order by就是女生排列在前

把男生排前面

1
select * from tb_student order by ssex desc;

desc: 下降,降序排列

#####多个排序关键字

1
select * from tb_student order by ssex asc, sbirth desc;

排序+筛选:筛选要写在排序的前面

  1. 查询男学生的姓名和生日按年龄从大到小排列
1
select sname, sbirth from tb_student where ssex=1 order by sbirth;
  1. 查询所有录入了家庭住址的男学生的姓名、出生日期和家庭住址按年龄从小到大排列
1
select sname, sbirth, saddr from tb_student where saddr is not null and ssex=1 order by sbirth desc;

聚合函数

数据库都有的五个聚合函数:max() / min() / sum() / avg() / count()

MySQL特有函数: now() / if()

查询年龄最大的学生的出生日期

1
2
select min(sbirth) from tb_student;
select max(sbirth) from tb_student;

查询课程编号为1111的课程的平均成绩

1
select cid, avg(score) from tb_sc where cid=1111;

查询学号为1001的学生所有课程的平均成绩

1
2
select sid, avg(score) from tb_sc 
where sid=1001;

查询每门课程的平均成绩

1
select cid, avg(score) from tb_sc group by cid;

聚合函数是自动排除空值的

查询平均成绩不及格的课程

where子句构造的筛选是分组以前的筛选
如果希望对分组以后的数据进行筛选那么要写having子句而不是where子句

表明这个分组拥有的进行筛选

1
select cid, avg(score) as avgScore from tb_sc group by cid having avgScore<80;

分组查询

查询所有学生人数

1
select count(stuid) from tb_student;

查询男学生人数

1
select count(stuid) from tb_student where ssex=1;

查询男女学生的人数

1
select if(ssex, '男', '女')as 性别, count(*)as 人数 from tb_student group by ssex;

经验: 在使用group by分组时如果不希望执行默认的排序操作
可以在分组后使用order by null来避免默认的排序操作提升查询性能

1
2
select if(ssex, '男', '女') as 性别, count(*) as 人数 
from tb_student group by ssex order by null;

#####筛选(where) > 分组(group by) > 筛选(having) > 排序(order by)>分页

筛选有家庭住址的男女学生的人数,并按男学生在前女学生在后排序

1
select if(ssex, '男', '女')as 性别, count(*)as 人数 from tb_student where saddr is not null group by ssex order by ssex desc;

#####分组查询和空值处理: 查询每个学生的学号和平均成绩

1
2
select sid, avg(score) from tb_sc 
group by sid having avg(score)<60;

子查询

子查询就是:查询作为另一个查询的一部分使用

#####查询年龄最大的学生的姓名

1
2
select sname, sbirth from tb_student
where sbirth=(select min(sbirth) from tb_student);

#####查询选了两门以上的课程的学生姓名

1
2
3
4
select sname from tb_student 
where stuid in (
select sid from tb_sc
group by sid having count(sid)>2);

#####查询选了两门以上的课程的男学生姓名

1
2
3
4
select sname from tb_student 
where stuid in (
select sid from tb_sc
group by sid having count(sid)>2) and ssex=1;

我们建议先写可以去掉部分对象的筛选条件写在右边,因为在sql中写在右边的条件先执行

####连接查询

在使用到多张表时需要使用连接查询,最常见的就是自然连接,即用表之间的外键连接起来

#####查询学生姓名、所选课程名称和成绩

1
2
3
select sname, cname, score 
from tb_sc, tb_student, tb_course
where sid=stuid and cid=courseid;

利用衍生表(临时表)查询

#####子查询:查询选课学生的姓名和平均成绩

最好是从里往外写,先写子查询

两表连查

1
2
3
4
select sname, avgScore from tb_student,
(select sid, avg(score) as avgScore from tb_sc
group by sid) t
where stuid=sid;

​ 必须给衍生表别名,给表别名一般不写as,给列别名需要写上

1
2
3
4
select sna me, avgScore from tb_student t1,
(select sid, avg(score) as avgScore from tb_sc
group by sid) t2
where stuid=sid;

#####查询每个学生的姓名和选课数量

1
2
3
select sname, sidCount from tb_student,
(select sid, count(sid) as sidCount from tb_sc group by sid) t
where stuid=sid;

​ 在写列名是如果有重名的冲突,可以在前面加上表名

#####内连接:只有满足条件的才查上来

1
2
3
4
5
select sname, avgScore from tb_student t1
inner join
(select sid, avg(score) as avgScore from tb_sc
group by sid) t2
on stuid=sid;

#####左外连接: 左表(写在前面的表)不满足连表条件的记录也要查询出来

1
2
3
4
5
select sname, ifnull(total, 0) as total from tb_student t1
left outer join
(select sid, count(sid) as total from tb_sc
group by sid) t2
on stuid=sid;
1
2
3
4
select sname, total from 
(select sid, count(sid) as total from tb_sc
group by sid)t2 left outer join tb_student t1
on stuid=sid;

#####右外连接: 右表(写在后面的表)不满足连表条件的记录也要查询出来

1
2
3
4
select sname, ifnull(total, 0) as total from
(select sid, count(sid) as total from tb_sc
group by sid) t2 right outer join tb_student t1
on stuid=sid;

#####全外连接: 左右两张表不满足连表条件都要查询出来

​ MySQL不支持使用全外链接(full outer join)

在表与表之间有逗号,内链接,左右连接不写逗号;连表条件用on表示

分页查询

不同的数据库在这一部分上非常不同,此处只介绍mysql数据库的做法,分页查询可以让效率更高

1
2
3
4
select sid, sname, cname, score from 
tb_sc inner join tb_student on stuid=sid
inner join tb_course on cid=courseid
limit 5;

limit 5:只显示5条

limit 5 offset 0:偏移量是0,从第一条开始

limit 5 offset 5:从第六条开始,查5条

limit 0, 5:从第一条开始只显示5条

mysql数据库CRUD-2

发表于 2018-09-01

本文主要介绍mysql数据库的关联关系,范式级别,用户和权限等相关内容

关联关系:

​ 数据库中的表与表之间的关系有一对一,一对多,多对多三种。建立的方法是:

​ 在一对多中多的那一侧建立外键约束(alter table 表名 add constraint fk-表-外键 foreign key (外键) references 参考表 (其主键)),对应一种的主键即一对多的关联关系;

​ 在一多对的关系中再加上唯一性约束(alter table 多的表 add constraint uk-表-外键 unique(外键);)即建立了一对一的关联关系

​ 多对多的关系是需要一张中间表,中间表中的两个外键分别对应其他两张表的主键即可。

关系型数据库中数据完整性:

  1. 实体完整性:每条记录都是独一无二的(主键/唯一约束/唯一索引)
  2. 参照完整性:表中的数据要参照其他表已有的数据(外键)
  3. 域完整性:数据是有效的(数据类型/非空约束/默认值约束/检查约束)

表的范式级别

范式级别

第二范式级别的场景

不符合第二范式级别的场景

第二范式级别

使其符合第二范式的办法:

  1. 增加一个专门做主键的列,比如编号
  2. 拆分成两张表
第三范式级别

第三范式

第三范式键要直接依赖主键,间接依赖就不符合

​ 不满足的情况,出现大量的冗余,浪费空间

​ 拆分成两张表就符合第三范式,但查询时需要查询两张表,节约了空间浪费了时间

​ 所以某些时候我们为了节约时间会有意而为之,造成冗余而节约时间

授予和召回权限

#####创建用户并指定登录口令

1
create user xiaoming identified by '123456'

授予权限

表的所有权限

1
grant all on student.tb_student to xiaoming;

grant:授权
all:所有权限
on student.tb_student:哪个数据库的哪张表
to:给谁

单个数据库的所有权限

1
grant all on student.* to xiaoming;

所有数据库的所有权限

1
grant all on *.* to xiaoming;

还可以限定只能从哪台机器登录

1
grant all on *.* to 'xiaoming'@'10.7.152.49';

%:就是从那里登录都可以

#####也可以从可视化工具修改

部分权限

授予查询权限

1
grant select on student.tb_student to xiaoming;
召回权限
1
revoke all on student.tb_student from xiaoming;

revoke:召回权限

from:召回所有权限

删除用户
1
drop user xiaoming;

#####修改用户密码

1
alter user 'xiaoming'@'%' identified by '新密码';

密码的编码

密码编码

数据分析的基础2

发表于 2018-08-31

图像的数组表示

​ 图像一般采用RGB色彩模式,即图像的每个像素点的颜色由红(R)、绿(G)、蓝(B)组成。

rgb颜色

PIL库

PIL,Python Image Library

PIL

hexo生成博客显示图片的问题

发表于 2018-08-29

连接mysql数据库

发表于 2018-08-29

网络爬虫6— Selenium

发表于 2018-08-24
  1. 创建一个浏览器对象,通过谷歌驱动,可以直接指定谷歌驱动的路径,也可以将谷歌驱动放到环境变量中

    1
    path
  2. 通过browser进行上网

  3. 通过连接的内容找到美女-百度百科

    点击,停顿

  4. 将浏览器退出

数据分析的基础

发表于 2018-08-24

以下是学习数据分析所做的笔记,深入浅出的介绍了数据分析及使用的工具

####ipython是什么呢?就是调用python解释器的交互式环境

%run run命令,在ipython中执行.py程序,在一个空的命名空间执行%

ipython的魔术命令:

魔术命令

数据的维度

  • 维度:一组数据的组织形式

  • 一维数据:有对等关系的有序或无序数据构成,采用线性方式组织。对应列表、数组和集合等概念

  • 列表和数组:

    同:都是一组数据的有序结构

    不同:列表的数据类型不同,而数组的数据类型是相同的
    
  • 二维数据:

    由一维数据构成,是一维数据的组合形式。表格时典型的二维数据,其中表头可以是二维数据的一部分,也可以在二维数据之外。

除此之外还有多维数据存在,多维数据是由一维或二维数据在新的维度上扩展形成的

最后是高维数据,就是用键值对讲数据组织起来形成的数据组织方式。高维数据仅利用最基本的二元关系,就能展示数据间的复杂结构。那么这些数据维度在python中是如何表示的呢?

数据维度的python表示

一维数据:列表(有序)和集合(无序)类型

二维数据:二维列表

多维数据:多维列表

高维数据:字典类型或者数据表示格式(json,xml,yaml)

####NumPy

NumPy是一个开源的python科学计算基础库

image-20180827111756365

image-20180827112320141

numpy底层是使用c语言,速度快,效率高

一方面是编程上,简单方便。一方面是效率上高效。

image-20180827112612779

ndarray在程序中的别名是:array

描述ndarray的基本方式
轴(axis):保存数据的维度

秩(rank):轴的数量

ndarray对象的属性:

image-20180827113104950

numpy定义的元素类型:

image-20180827113545736

无符号:
image-20180827113704020

复数类型:

image-20180827113833404

为什么需要这么多的数据类型:

image-20180827114558540

ndaray也可以由非同质对象构成:

image-20180827114833920

ndarray数组的创建和变换

创建ndarray数组的方式有四种:

  • 从Python中的列表、元组等类型创建ndarray数组

    创建数组

    使用np.array()函数创建,可以指定数据类型

  • 使用NumPy中函数创建ndarray数组,如:arange,ones,zeros等

image-20180827124428961

np.arange(n): 生成一个递增的整数序列

np.ones(shape): 生成一个m行,n列的数组,也可以用来生成多维数组

np.zeros(shape): 生成一个m行n列,值全部为0的数组

ones,zeros生成的都是浮点数类型,除非用户来指定

np.full(shape, val): 生成一个元素值为val的数组

np.eye(n): 生成一个n*n的单位矩阵,对角线为1,其余为0

hanshu

函数2

np.linspace

第一个参数是起始位置,第二是结束位置,第三个是希望的元素个数

生成浮点数

endpoint是否是开区间

numpy将输出的数基本都是浮点数,除了arange这样的函数,因为numpy是科学计算的包

  • 从字节流(raw bytes)中创建ndarray数组
  • 从文件中读取特定格式,创建ndarray数组。
ndarray数组的变换

对于创建后的ndarray数组,可以对其进行维度变换和元素类型变换

变换

ndarray数组的类型变换

类型转换

ndarray数组向列表转换

转换成数组

列表是python原始的数据类型,比数组与原生程序更加适应

ndarray数组的操作(索引和切片)

索引:获取数组中特定位置元素的过程

切片:获取数组元素子集的过程

#####一维数组的索引和切片:与python的列表类似

提供两种顺序方式:

  1. 从0开始向右侧递增;从-1开始向左侧递减
  2. 切片的基本方法[m:n:y]

    m:开始索引
    
    n:结束索引(不包含)
    
    y:步长
    
多维数组的索引

多维数组索引

多维数组的切片:

​ 在每个维度上,用户给出一个切片空间,将不同的切片空间组织起来,形成的一个子集的获取方式

多维数组的切片

我们可以将三维坐标看成一栋建筑,两层楼,每层3行4列共12个房间。选定任意一个房间,即楼层、行号和列号。例如,选定第1层楼、第1行、第1列的房间,冒号就是选定所有的楼层(不关心楼层),所有行列,::2就是步长为2,每隔一个元素选取一个元素。多个冒号可以用省略号代替。

ndarray的运算

标量:一个数据就叫标量

数组与标量之间的运算等价于数组的每一个元素都与标量进行运算

数组运算

一元运算

一元函数,对单一ndarray数组进行的运算,就是对每一个元素的运算
ndarray的一元函数

numpy一元函数

基本所有的一元函数都是新生成了数组

二元函数

二元函数

数据的csv存储

什么是csv文件

csv(Comma-Separated Value, 逗号分隔值)

csv是一种常见的文件格式,用来存储批量数据

在numpy中有两个函数可以向文件中写入csv格式,并从csv文件中读取数据

保存csv文件

fmt是用户主要修改的参数,默认是使用科学技术法保留18位小数

np的savetxt函数并不是为了特定的生成csv格式的文件而生,它可以生成任何带有逗号分隔或其他字符分割的文件,但由于csv文件的普遍使用所以我们一般用来生成csv格式的文件

例子csv

例子2csv

读取csv格式的数据

读取csv

读取例子:

例子读取csv

​ 但csv文件也有局限性:

​ csv智能有效存储一维和二维数组,np.savetxt()/np.loadtxt()只能有效存储一维和二维数组。那么下面就来看看多维数据的存储方法

多维数据的存储

多维数组的读取

例子:

tofile例子

​ 与csv文件的不同在于,这个文件没有维度信息,只是将数组中的所有元素列出并输出到这个文件中

​ 如果不指定第二个参数,数据分割字符串,会生成二进制的文件,二进制文件无法用文本编辑器读取,但是二进制文件占用的空间更少,我们只能将它作为数据备份的一种方式

从二进制文件\文本文件还原数据

无论什么样的数据方法,从文件中读回元素的时候都要指定文件数据类型,因为只有指定了数据类型才能正确解析数据内容,默认的dtype是float类型

读取文件fromfile

fromfile例子

在读取文件的时候,维度信息丢失,必须指定维度信息才能还原数据

读取二进制文件

fromfile读取二进制文件

注意:该方法需要读取时知道存入文件时的数组维度和元素类型a.tofile()和np.fromfile()需要配合使用

​ 如何知道存入文件时的数组维度和元素类型呢?方法是在写一个文件,将数组的维度和元素类型作为元数据文件存储起来,在读取文件时打开元数据文件获取信息还原数组,虽然有一些麻烦,但是对于大规模数据的存储是很有效的

numpy提供的便捷的多维文件存储方法

numpy文件存储

savez就是压缩文件的存储

例子numpy文件存储

​ 这个自带的方法可以默认还原文件的维度和数据类型,十分便捷。因为这个方法是用二进制的方式将文件保存起来,而将数据的维度和类型以元信息的方式写到了第一行中,load函数在解析时通过解析第一行数据还原数组

​ 如果我们的程序中间需要文件缓存,那么使用save和load方法是非常有效便捷的一种

​ 如果你希望程序能够与其他的程序做数据交互和对接,那么你需要考虑使用csv文件,或者使用tofile方法生成一个其他程序可以使用的文件。

NumPy的随机数函数

python的内置函数random库为一般的标量参数提供随机数

在NumPy库中有一个相似的函数

  • np.random.*
  • np.random.randn()
  • np.random.rand()
  • np.random.randint()

numpy的随机数函数1

均匀分布每一个元素出现的概率都是相同的

例子:

均匀随机浮点数

rand例子

标准正态分布随机浮点数

randn

随机整数数组

randint

生成指定个相同的随机数

种子随机数

可以在测试时得到相同的产生的随机数组

高级的随机数函数

随机数函数2

例子1:高级的洗牌(混淆)函数,改变数组a的第一轴随机排序
高级随机数函数例子1

高级随机数函数2

例子2:
gjsjshs3

#####高级的随机数数组函数:

随机数数组

例子1:

正太分布数组

正态分布数组

正态分布是围绕某一均值,在特定方差下,一种随机变量取值的空间可能

NumPy的统计函数

统计函数顾名思义就是能够对数据中的信息进行统计运算的函数,NumPy提供的统计类函数直接使用函数名来调用

  • np.std()

  • np.var()

  • np.average()

np.random的统计函数1:

np.random的统计函数

期望:即算术平均和

默认的是axis=None是统计函数的标配参数,即不关心数据的维度,对所有的元素操作
例子:
random统计函数

统计函数2:

random的统计函数2

argmin(a)/argmax(a):获取最大值和最小值的被扁平化形成一维之后的位置(下标)

例子:

统计函数例子2

tips:median函数获取中位数是一种运算,是通过公式求得的

NumPy的梯度函数

NumPy中的梯度函数只有一个:

梯度函数

梯度:是指连续值之间的变化率,即斜率

​ 在xy坐标轴中有连续的三个值,它们的Y轴值为a,b,c。我们计算b的梯度(斜率)就是用后一个值减去前面一个值的差除以它的后一个值到前一个值之间的距离。就是:(c-a)/2

​ 最后一个值就是本身减去上一个值,除上距离

例子:

梯度值例子

二维函数计算梯度值与一维函数类似:

梯度例子2

​ 梯度变化了元素的变化率,特别是我们在处理图像和声音时,梯度有助于我们发现图像和声音的边缘。在变化明显的地方,梯度可以明显的发现。所以在进行图像和声音等多媒体运算时非常有用。

数据分析 ———— 4

发表于 2018-08-23

数据清洗和准备

12…4
karen2066

karen2066

35 日志
8 标签
© 2018 karen2066
由 Hexo 强力驱动
|
主题 — NexT.Gemini v5.1.4