核心库
1、NumPy
当我们用python来处理科学计算任务时,不可避免的要用到来自SciPy Stack的帮助。SciPy Stack是一个专为python中科学计算而设计的软件包,注意不要将它与SciPy库搞混了,后者只是这个软件包中的一部分。接下来我们一块来看看这个软件包。通常这个软件包是非常大的,里面包含十几个库。但是,在这里我们将集中介绍最核心的库,尤其是最基础的。
NumPy(表示Numerical Python)是构建科学计算包最基础的库。它为python中n维数组和矩阵操作提供了大量有用的功能。这个库还支持NumPy数组类型的向量化数学操作,能够改善计算性能,加快计算速度。
2、SciPy
SciPy是一个工程和科学计算的软件库。在这里,你需要再次理解SciPy Stack和SciPy库的不同。SciPy包含许多和线性代数,数学优化,积分和统计有关的模块。SciPy库的主要功能是构建在NumPy上的,因为它使用了大量NumPy库的数组。SciPy通过其特有的子模块提供许多有关数值积分,优化和其它方面的例程,而且其子模块都有详细的功能说明。
3、Pandas
Pandas是一个python库,通过数据标记和数据之间的关系来进行工作,其特点是简单直观。它非常适合用于数据分析,可以快速简单的对数据进行操作,整合以及可视化。
来看下在这个库里主要的两种数据结构:
“Series"-一维数据结构
“Data Frames”-二维数据结构
例如,当你想将这两种数据结构混合形成一个新的DataFrame时,原来的Series会追加在原来的DataFrame后面:
这里列出用Pandas可以很容易做的一些操作:
-
从DataFrame中可以容易的删除和添加列
-
将数据结构转换成DataFrame对象
-
将不存在的数据用NaN替代
-
强大的数据分组功能
可视化
4、Matplotlib
Matplotlib是SciPy Stack核心软件包中的另一个python库,可以轻松的生成简单强大的数据可视化图。在NumPy,SciPy和Pandas的基础上,Matplotlib是构成python的一个强大的工具包,可以和科学计算工具Matlab,Mathematics等形成强大的竞争力。唯一不足的是这个库的层次比较低,要想实现高水平的数据可视化必须要付出更多的努力写更多的代码。不过,总的来说,它还是值得一试的。
下面列出一些其常用的可视化图:
-
直线图
-
散点图
-
条形图和直方图
-
饼状图
-
茎叶图
-
矢量图
-
量场图
-
频谱图
当然,还可以使用Matplotlib来创建标签,网格,图例等其它与图形相关的操作,基本上,所有东西都是可以自定义的。这个库支持不同的平台,在相应的平台下会充分利用其对应的GUI套件让结果可视化。此外,不同的IDE(像IPython)都支持Matplotlib的操作。当然还有一些其它的库使得数据可视化操作更加容易。
5、Seaborn
Seaborn主要用来统计模块的可视化操作,例如可以用其来显示热量图以反映数据的总体分布。此外,这个模块是构建在Matplotlib上的,并且高度依赖它。
6、Bokeh
另一个比较好的可视化包是Bokeh,其主要致力于交互式可视。与前面介绍的那些库不一样的是,Bokeh并不依赖于Matplotlib,其可以通过现代浏览器以脚本(d3.js)的形式来展现最终的图形。
7、Plotiy
最后,关于可视化python包的是Plotly。它是基于WEB工具箱来构建可视化的,其开放API接口给一些编程语言,当然包括python。在plotly的网站上有一些强大的开箱即用的图形,在使用plotly的时候最好设置好你的API密匙,这些图形将会在服务器一端处理并且可以发布到互联网上,当然也可以不必如此。
机器学习
8、SciKit-LearnScikits是SciPy Stack另外的包,专门为图像处理和机器学习等特定功能而设计的。对于机器学习,其最杰出的包就是scikit-learn,这个包构建在SciPy之上,大量使用了SciPy的数学操作。Scikit-learn向一般的机器学习算法开放了一个简洁一致的接口,使得机器学习可以简单的推进到生产系统中。这个库包含了许多高质量的代码和好的说明文档,非常容易使用,事实上,可以说是用python学习机器学习的行业标准了。
深度学习-Keras/TensorFlow/Theano
在深度学习方面,python中最突出和最方便的库就是Keras了,它可以说在TensorFlow和Theano功能之上。接下来,让我们看一下它们的一些细节。
9、Theano
首先是Theano,它和NumPy类似都定义了多维数组,同时还有一些其它的数学操作与表达式。这个库是编译过的,可以高效的运行在各种架构上。它最初是由蒙特利尔大学机器学习小组开发的,主要用于机器学习。
有一点需要指出的是,Theano和NumPy在低层次的操作上有着紧密的结合。而且它还充分优化了GPU和CPU的使用,在数据密集型计算方面速度更快。在效率和稳定性方面的优化使得其可以计算更加精确的结果甚至是非常小的值。例如在计算 log(1+x)时,可以给出x的最小值以及最终的结果。
10、TensorFlow
TensorFlow来自谷歌的开发小组,是一个基于数据流图计算的开源库,它强化了机器学习,旨在满足Google环境对训练神经网络的高需求,可以看做是基于神经网络 机器学习系统DistCelief的继任者。此外,TensorFlow不仅用在Google科学计算,也可以满足实际应用的要求。TensorFlow的关键特点是其多层节点系统,可以在大型数据集上快速训练人工神经网络。这为Google的语音识别和图像对象识别提供了支持。
11、Keras
最后,让我们来看下Keras。Keras是用纯python写的高层神经网络开源库,具有简单易懂的高级扩展性。它用Theano和TensorFlow作为其后端,但是微软现在将CNTK(微软的认知工具包)集成为新的后端。Keras在设计中的简约方法旨在通过建立紧凑的系统来进行快速和容易的实验。
Keras是非常容易上手的,而且一直在其原型上不断地发展改进,具有高度的模块化和扩展性。抛开它的轻便,简洁以及高度模块化,Keras还是构建复杂模型的有力工具。
自然语言处理
12、NLTK
NLTK是Natural Language Toolkit的缩写,顾名思义,它是用来处理符号和统计自然语言处理的任务。NLTK旨在促进NLP及其相关领域(语言学,认知科学人工智能等)的教学与研究,目前正受到广泛的关注。
NLTK的功能允许很多操作,例如支持文本标记,分类,实体标识,建立语言树来显示句子间内的依赖关系等各种常用功能。所有的构件块都可以为不同的任务构建复杂的研究系统,例如情绪分析,自动总结等。
13、Gensim
Gensim是一个在Python中实现的成熟的开源 向量空间建模和主题建模工具包。它不仅可以用来进行内存处理,更适用于处理大型文本集。而且其通过使用NumPy和SciPy的数据结构极大的提高了执行性能,是非常高效和容易使用的。
Gensim旨在与原始非结构化数字文本一起使用。 其实现了诸如分层Dirichlet进程(HDP),潜在语义分析(LSA)和潜在Dirichlet分配(LDA)之类的算法,以及tf-idf,随机投影,word2vec和document2vec用于于检查文本中的重复文本的一组文件(通常称为语料库)。这里所有的算法都是无监督的 ,不需要添加任何参数,唯一的输入就是语料库。
数据挖掘与统计
14、Scrapy
Scrapy是用于从网络上检索结构化数据(如联系人信息或URL)的爬行程序库(也称为蜘蛛机器人)。它是开源的,也是用python编写的,并严格按照其名称所示的方式进行设计。现在它已经在完整的框架中发展,能够从API中采集数据并作为通用的爬虫。
这个库以其著名的设计原则“不要重复代码”来提示用户重构那些将要重复使用的通用代码,因此,这通常用来构建和扩展大型爬虫。Scrapy的架构紧紧围绕着Spider类来构建,其包含了爬行器跟踪的一套指令。
15、Statsmodels
正如你从名字中看出的那样,Statsmodels是一个python库,旨在让用户通过使用各种统计模型来进行数据挖掘与分析。实际中许多有用的特征都是描述性的,其结果可以通过使用线性回归模型,广义线性模型,离散选择模型,鲁棒线性模型,时间序列分析模型来进行统计估量。这个库还提供了广泛的绘图功能,专门用于统计分析和大数据统计数据。
1.Python是一种解释型语言.Python解释器是通过“一次执行一条语句”的方式运行程序的。Python科学计算程序员则更趋向于使用IPython(一种加强的交互式Python解释器)。通过使用命令%run,IPython会在同一个进程中执行指定文件中的代码。(.py文件和IPython解释器在同一目录下,或者运行时加上文件路径)
-
%run hello_world.py #out: Hello world
-
%run E:/hello_world.py #out: Hello world
2.元组是一种一维的,定长的,不可变的Python对象序列。最简单的创建方式是一组以逗号隔开的值。通过调用tuple,任何序列或迭代器都可以被转换成元组。
-
tup = 4,5,6
-
print tup #(4,5,6)
-
print tuple([4,0,2]) #(4,0,2)
-
print tuple('string') #('s','t','r','i','n','g')
-
a = 5
-
b = 2
-
b,a = a,b
-
print a,b # 2 5
-
-
seq = [(1,2,3),(4,5,6)]
-
for a,b,c in seq:
-
print a,b,c
-
# 1 2 3
-
# 4 5 6
-
-
a = (1,2,2,2,3,4,3,2)
-
print a.count(2) #4
-
a_list = [2,3,4,None]
-
print a_list #[2, 3, 4, None]
-
tup = ('foo','bar','baz')
-
b_list = list(tup)
-
print b_list #['foo', 'bar', 'baz']
-
-
b_list.append('dwarf')
-
print b_list #['foo', 'bar', 'baz', 'dwarf']
-
print [4,None,'foo'] + [7,8,(2,3)] #[4, None, 'foo', 7, 8, (2, 3)]
-
x = [4,None,'foo']
-
x.extend([7,8,(2,3)])
-
print x #[4, None, 'foo', 7, 8, (2, 3)]
-
everything = []
-
for chunk in list_of_lists: #合并速度快的多
-
everything.extend(chunk)
-
-
for chunk in list_of_lists:
-
everything = everything + chunk
6.对于一个序列进行迭代时,常常需要跟踪当前项的索引,Python内置了一个enumerate函数,它可以返回序列的值和索引。
-
i = 0
-
for value in ['aa','bb','cc']:
-
i += 1
-
print str(i) + ":" + value
-
-
for i,value in enumerate(['aa','bb','cc']): # 0:aa
-
print str(i) + ":" + value # 1:bb
-
# 2:cc
-
some_list = ['foo','bar','baz']
-
mapping = dict((v,i) for i,v in enumerate(some_list))
-
print mapping #{'baz': 2, 'foo': 0, 'bar': 1}
-
seq1 = ['foo','bar','baz']
-
seq2 = ['one','two','three']
-
print zip(seq1,seq2) #[('foo', 'one'), ('bar', 'two'), ('baz', 'three')]
-
-
for i,(a,b) in enumerate(zip(seq1,seq2)): #0:foo,one
-
print('%d:%s,%s'%(i,a,b)) #1:bar,two
-
#2:baz,three
8.调用列表的sort方法可以实现就地的排序。sorted函数可以将任何序列返回为一个新的有序列表。reversed用于按逆序迭代序列中的元素。
-
a = [7,2,5,1,3]
-
a.sort()
-
print a #[1, 2, 3, 5, 7]
-
-
print sorted([7,1,2,6,0,3,2]) #[0, 1, 2, 2, 3, 6, 7]
-
print list(reversed(range(10))) #[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
9.导入工具库,dir(math)查看模块中的方法和属性。
-
from some_module import f #f直接用
-
import some_module as sm # sm.f
-
import some_module # some_module.f
10.Python用if elif else,True False首字母要大写。
-
hw2015 = "%s %s %d"%('Hello','world',2015)
-
print hw2015 #Hello world 2015
-
-
print "{} is a {}".format("THis","string") #THis is a string
-
print "{0} can be {1}".format("strings","formatted") #strings can be formatted
-
import numpy as np
-
print range(5) #[0, 1, 2, 3, 4]
-
print range(1,9,2) #[1, 3, 5, 7]
-
-
print np.arange(5) #[0 1 2 3 4]
-
-
print xrange(5) #xrange(5)
-
print list(xrange(5)) #[0, 1, 2, 3, 4]
-
-
for i in xrange(5):
-
print i
-
d1 = {'a':'some value','b':[1,2,3,4]}
-
print d1 #{'a': 'some value', 'b': [1, 2, 3, 4]}
-
d1[7] = 'an integer' # 添加元素
-
print d1 #{'a': 'some value', 'b': [1, 2, 3, 4], 7: 'an integer'}
-
print d1['b'] #[1, 2, 3, 4] 访问元素
-
-
del d1[7] #删除元素
-
print d1 #{'a': 'some value', 'b': [1, 2, 3, 4]}
-
d1 = {'a':'some value','b':[1,2,3,4]}
-
print d1.keys() #['a', 'b']
-
print d1.values() #['some value', [1, 2, 3, 4]]
-
d1 = {'a':'some value','b':[1,2,3,4]}
-
d1.update({'c':12})
-
print d1 #{'a': 'some value', 'c': 12, 'b': [1, 2, 3, 4]}
-
key_list = ['a','b']
-
value_list = [1,2]
-
mapping = {}
-
for key,value in zip (key_list,value_list):
-
mapping[key] = value
-
print mapping #{'a': 1, 'b': 2}
-
words = ['apple','bat','bar','atom','book']
-
by_letter = {}
-
for word in words:
-
letter = word[0]
-
if letter not in by_letter:
-
by_letter[letter] = [word]
-
else:
-
by_letter[letter].append(word)
-
print by_letter #{'a': ['apple', 'atom'], 'b': ['bat', 'bar', 'book']}
-
words = ['apple','bat','bar','atom','book']
-
from collections import defaultdict
-
by_letter = defaultdict(list)
-
for word in words:
-
by_letter[word[0]].append(word)
-
print by_letter
-
#defaultdict(<type 'list'>, {'a': ['apple', 'atom'], 'b': ['bat', 'bar', 'book']})
-
strings = ['a','as','bat','car','dove','python']
-
list_comp = [x.upper() for x in strings if len(x)>2]
-
print list_comp #['BAT', 'CAR', 'DOVE', 'PYTHON']
-
set_comp = {len(x) for x in strings}
-
print set_comp #set([1, 2, 3, 4, 6])
-
map_comp = {val:index for index,val in enumerate(strings)}
-
print map_comp #{'a': 0, 'bat': 2, 'python': 5, 'car': 3, 'as': 1, 'dove': 4}