python算法

第九周 计算生态概览

戏子无情 提交于 2020-02-26 15:41:35
从数据处理到人工智能 数据表示:采用合适方式用程序表达数据 数据清洗:数据归一化、数据转换、异常值处理 数据统计:数据的概要理解,数量、分布、中位数等 数据可视化:直观展示数据内涵的方式 数据挖掘:从数据分析获得知识,产生数据外的价值 人工智能:数据/语言/图像/视觉等方面深度分析与决策 数据分析 Numpy:表达N维数组的最基础库,是众多数据分析库的基础,使用C语言实现,但对外的接口是python语言,计算速度优异;基本支撑了python数据分析及科学计算的基础库,例如Pandas等;提供矩阵运算、广播函数、线性代数等功能。 Pandas:python数据分析高层次应用库。提供简单易用的数据结构和数据分析工具;理解数据类型与索引的关系,操作索引即操作数据;是python最主要的数据分析功能库,基于Numpy开发。 Series=索引+一维数据 DataFrame=行列索引+二维数据 SciPy:数学、科学和工程计算功能库。提供一批数学算法及工程数据运算功能;类似matlab,可用于傅里叶变换、信号处理等应用;python最主要的科学计算功能库,基于Numpy开发。 数据可视化 Matplotlib:高质量的二维数据可视化功能库。提供了超一百种数据可视化展示效果;通过matplotlib.pyplot子库调用可视化效果;python最主要的数据可视化功能库,基于Numpy开发。

Python性能优化的20条建议

会有一股神秘感。 提交于 2020-02-26 10:33:59
优化算法时间复杂度 算法的时间复杂度对程序的执行效率影响最大,在Python中可以通过选择合适的数据结构来优化时间复杂度,如list和set查找某一个元素的时间复杂度分别是O(n)和O(1)。不同的场景有不同的优化方式,总得来说,一般有分治,分支界限,贪心,动态规划等思想。 减少冗余数据 如用上三角或下三角的方式去保存一个大的对称矩阵。在0元素占大多数的矩阵里使用稀疏矩阵表示。 合理使用copy与deepcopy 对于dict和list等数据结构的对象,直接赋值使用的是引用的方式。而有些情况下需要复制整个对象,这时可以使用copy包里的copy和deepcopy,这两个函数的不同之处在于后者是递归复制的。效率也不一样:(以下程序在ipython中运行) import copy a = range(100000) %timeit -n 10 copy.copy(a) # 运行10次 copy.copy(a) %timeit -n 10 copy.deepcopy(a) 10 loops, best of 3: 1.55 ms per loop 10 loops, best of 3: 151 ms per loop timeit后面的-n表示运行的次数,后两行对应的是两个timeit的输出,下同。由此可见后者慢一个数量级。 使用dict或set查找元素 python

从无到有用Python创造一门属于自己的编程语言1

安稳与你 提交于 2020-02-25 23:37:24
前言 如果你会编译原理,对其中的词法分析算法,语法分析算法足够了解,那么用什么语言来做这样的一件事情都是可以的,之所以使用Python只是因为本人会的编程语言中, Python的使用时间最长,也最得心应手。所谓性能什么的不在本文的考虑范围内, 本文主要重点是语法分析的表达式的解析,语法解析使用的是普拉特分析法,一种自顶向下的语法解析方法。 文章目录如下: 四则运算的问题 词法分析 语法分析与解释执行 参考链接 这有什么用 后记 源代码 四则运算的问题 怎么解决让代码算出以下解决结果?(假设问题代码保存文1.txt) 1 + 2 * 3 - 4 / 5 不用语法分析, 最简答的解决办法就是 with open("1.txt") as rf: print(eval(rf.read())) # 输出结果 6.2 那么如果是以下面的代码呢?(假设问题代码保存文2.txt) add(1, add(1,2)) 不用语法分析, 最简单的解决办法是 def add(a, b): return a + b with open("2.txt") as rf: print(eval(rf.read()), dict(add=add)) # 输出结果 4 {'add': <function add at 0x0000013E8033AD90>} 如果要求加法的优先级大于乘法呢?就是说先加后乘,比如1+2

Python调用C++之PYBIND11简介

夙愿已清 提交于 2020-02-25 21:52:50
简介 PyBind11是能够让C++和Python代码之间相互调用的轻量级头文件库。在这之前已经有了一个类似功能的库:Boost.Python。既然已经有了一个类似库,而且PyBind11的目的和语法都与Boost.Python相似,为什么还要重复造轮子?原因主要有以下亮点: Boost.Python为了兼容大多数C++标准和编译器,它使用了很多可以说是魔法的操作去解决问题而变得非常的臃肿; 目前很多编译器对C++11已经有很好的支持,而且C++11应用也比较广泛。 因此,PyBind11应运而生,他能在抛弃Boost.Python的负担同时又具备Boost.Python的简单操作。 使用 PyBind11的主要目的是将已有的C++代码接口暴露给Python去调用。例如, ONNX Runtime --一个用于ONNX格式的神经网络模型推理的引擎,其推理的核心模块是用C++写的,但是从易用性、Python AI 方面的主导地位等方面考虑,它需要将模型推理的接口暴露给Python。在之前的文章 ONNX Runtime 源码阅读:模型推理过程概览 中也有提到过。其接口暴露代码在$ONNX_RUNTIME/onnxruntime/python/onnxruntime_pybind_state.cc中。 将C++暴露给Python主要有两个大方向: 将函数暴露给Python;

用两个栈实现队列(python)

蹲街弑〆低调 提交于 2020-02-25 01:11:35
用两个栈实现队列 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 算法分析 算法流程 Python语言语言前提下,定义两个列表(相当于C++中的堆栈),其中acceptStack列表(先进后出)用来存放输入的数据,putoutStack列表(先进后出)用来存放输出的数据。在C++中,堆栈的特征是先进后出,而队列的特征是先进先出,若用acceptStack存储输入的数据,再输出前先将输入的数据存入putoutStack,再输出,就可实现用两个堆栈构成一个队列的效果。 示例程序 # -*- coding:utf-8 -*- class Solution : def __init__ ( self ) : self . acceptStack = [ ] self . outputStack = [ ] def push ( self , node ) : # write code here self . acceptStack . append ( node ) def pop ( self ) : if self . outputStack == [ ] : while self . acceptStack : self . outputStack . append ( self . acceptStack . pop ( ) ) if

收藏!2020 年最具潜力 44 个顶级开源项目,涵盖 11 类 AI 学习框架、平台

佐手、 提交于 2020-02-24 07:14:25
工欲善其事必先利其器,这也是大部分开发者在日常工作中最重要开发原则。选择与开发内容相匹配的工具,常常会使我们事半功倍。但面对人工智能的多个领域,如:机器学习、深度学习、NLP等等,多样的工具有时也让我们也无从选择。 就在最近,一个基于 javascript 的可视化库 D3js(treemap 可视化)对 json 文件生成的技术图,给开发者提供了详细的各领域工具清单,内容涵盖了 11 种极具潜力的 AI 工具类型,我们将其整理如下,强烈建议大家收藏~ 原文链接:https://github.com/haggaishachar/techmap 目录: Ⅰ、经典机器学习(1-3) Ⅱ、深度学习(4-8) Ⅲ、强化学习(9-12) Ⅳ、自然语言处理(13-18) Ⅴ、语音识别(19-21) Ⅵ、计算机视觉(22-26) Ⅶ、分布式训练(27-31) Ⅷ、自动建模(32-35) Ⅸ、IDEs系统(36-38) Ⅹ、平台(39-41) Ⅺ、评分推理系统(42-43) I . 适用于经典机器学习的工具 一、SciKit-learn  star 39.2k  fork 19.2k scikit-learn 是一种强大的基于 Python 语言的机器学习算法库(https://scikit-learn.org/stable/)。其中,包含了算法预处理,模型参数择优,回归与分类等算法

[Python数据挖掘]第5章、挖掘建模(下)

橙三吉。 提交于 2020-02-23 01:28:46
四、关联规则 Apriori算法代码(被调函数部分没怎么看懂) from __future__ import print_function import pandas as pd #自定义连接函数,用于实现L_{k-1}到C_k的连接 def connect_string(x, ms): x = list(map(lambda i:sorted(i.split(ms)), x)) l = len(x[0]) r = [] for i in range(len(x)): for j in range(i,len(x)): if x[i][:l-1] == x[j][:l-1] and x[i][l-1] != x[j][l-1]: r.append(x[i][:l-1]+sorted([x[j][l-1],x[i][l-1]])) return r #寻找关联规则的函数 def find_rule(d, support, confidence, ms = u'--'): result = pd.DataFrame(index=['support', 'confidence']) #定义输出结果 support_series = 1.0*d.sum()/len(d) #支持度序列 column = list(support_series[support_series > support

[Python数据挖掘]第5章、挖掘建模(上)

孤街醉人 提交于 2020-02-23 01:28:08
一、分类和回归 回归分析研究的范围大致如下: 1、逻辑回归 #逻辑回归 自动建模 import pandas as pd from sklearn.linear_model import LogisticRegression as LR from sklearn.linear_model import RandomizedLogisticRegression as RLR #参数初始化 data = pd.read_excel('data/bankloan.xls') x = data.iloc[:,:8].as_matrix() #loc和iloc是Pandas中用于提取数据的函数 y = data.iloc[:,8].as_matrix() #复制一份,用作对比 x1=x y1=y rlr = RLR() #建立随机逻辑回归模型,筛选变量 rlr.fit(x, y) #训练模型 rlr.get_support() #获取特征筛选结果,也可以通过.scores_方法获取各个特征的分数 print(u'通过随机逻辑回归模型筛选特征结束。') print(u'有效特征为:%s' % ','.join(data.iloc[:,0:8].columns[rlr.get_support()])) #原代码此处报错 x = data[data.iloc[:,0:8].columns[rlr

python之random模块分析(一)

可紊 提交于 2020-02-22 16:01:32
random是python产生伪随机数的模块,随机种子默认为系统时钟。下面分析模块中的方法: 1.random.randint(start,stop): 这是一个产生整数随机数的函数,参数start代表最小值,参数stop代表最大值,两端的数值都可以取到; 函数算法时间复杂度:O(1) 核心源代码: return self.randrange(a, b+1) # 由randrange函数封装而来 例子: 1 for i in range(20): 2   print(rm.randint(0, 10), end=' ') 2.random.randrange(start,stop,step): 也是一个随机整数函数,参数可选; 当只有一个参数时,默认随机范围0到该 参数,前闭后开;两个参数,最小值和最大值,前闭后开;三个参数,最小值,最大值和步长,前闭后开。 算法时间复杂度:O(1) 核心源代码: return istart + istep*self._randbelow(n) # 该函数由_randbelow函数封装得到 例子: 1 for i in range(10): 2   print(random.randrange(10)) # 产生0到10(不包括)的随机数 3   print(random.randrange(5,10)) # 产生5到10(不包括)的随机数 4  

并查集的python实现

依然范特西╮ 提交于 2020-02-22 15:50:08
import numpy as np import os class DIS_JOIN(object): def __init__(self): ''' 并查集算法 拥有两个函数 一个是把某个元素放在某个集合中 另一个是返回一个list,包含所有集合和集合中所有的点 ''' self.Set = None self.Sum = None self.n = None def clear(self, n): ''' 初始化 n为一共有多少个元素 ''' self.Set = np.zeros(n, dtype=int) self.Set = self.Set - 1 # 都初始化为-1. 表示他自己就是根. Set是一个数组. # Set[i] 表示i的根是谁. self.Sum = n self.n = n return def find_r(self, p): ''' 返回p属于那一个集合 ''' if self.Set[p] < 0: return p self.Set[p] = self.find_r(self.Set[p]) #通过迭代不停的找根. return self.Set[p] def join(self, a, b): ''' 将元素b加入元素a所在的集合中 ''' ra = self.find_r(a) rb = self.find_r(b) if (ra !=