Python不仅适用于研究和原型构建,同时也适用于构建生产系统。
对于高并发,多线程的应用程序,Python不是一种理想的编程语言,因为Python有一个叫 全局解释锁 的东西,这是一种防止解释器同时执行多条Python字节码指令的机制。这并不是说Python不能执行真正的多线程并行的代码,只不过这些代码不能在单个Python进程中执行而已。
重要的Python库
NumPy
科学计算的基础包,提供的功能
对于大部分数据分析应用而言,功能体现有
创建ndarray
使用array函数,接受一切序列化型的对象(包括其他数组),然后产生一个新的含有传入数据的NumPy数组.数据类型保存在一个特殊的dtype对象中
import numpy as np
data1 = [6,7.5,8,0,1]
arr1 = np.array(data1)
print(arr1)
除np.array之外,还有一些函数也可以新建数组。比如zero和ones分别可以创建指定长度或形状的全0或全1数组
print(np.zeros(10))
print(np.ones(10))
dtype (数据类型 )是一个特殊对象,含有ndarray将一块内存解释为特定数据类型所需的信息
arr1 = np.array(data1,dtype=np.float64)
dtype是Numpy如此强大和灵活的原因之一。多数情况下,它们直接映射到相应的机器表示,这使得“读写磁盘上的二进制数据流”以及“集成低级语言代码(如C、Fortran)”等工作变得简单。数值型dtype的命名方式相同:一个类型名(如float或int),后跟一个表示各元素位长的数字。通过ndarray的astype方法显示地装换其dtype
数组和标量之间的运算
矢量化:用数组表达式代替循环
广播:不同大小的数组之间的运算
布尔型索引
布尔型数组的长度必须跟被索引的轴长度一致,还可以将布尔型数组跟切片、整数(或整数序列)混合使用
names == 'Bob'
array([True,False,False,True,False,False],dtype=bool)
data[names == 'Bob',2: ]
注意:Python关键字and和or在布尔类型数组中无效
数组转置和轴转换
转置(transpose)是重塑的一种特殊形式,它返回的是源数据的视图(不会进行任何复制操作)。数组不仅有transpose方法,还有一种特殊的T属性。对于高维数组,transport需要得到一个由轴编号组成的元组才能对这些轴进行转置
import numpy as np
arr = np.arange(15).reshape((3,5))
print(arr)
print(arr.T)
print(arr.transpose(1,0))
ndarray还有一个swapaxes方法,需要接受一对轴编号,swapaxes也是返回数据源的视图(不会进行任何复制操作)
通用函数:快速的元素级数组函数
通用函数(即ufunc)是一种对ndarray中的数据执行元素级运算的函数。也可以把它看做简单函数(接受一个或多个标量值,并产生一个或多个标量值)的矢量化包装器
许多ufunc都是简单的元素级变体,如sqrt和exp
import numpy as np
arr = np.arange(10)
print(np.sqrt(arr))
print(np.exp(arr))
上面的是一元(unary)ufunc。另外一些(如add或maximum)接受2个数组(因此也叫二元(binary)ufunc),并返回一个结果数组
import numpy as np
from numpy.random.mtrand import randn
x = randn(8)
y = randn(8)
print(x)
print(y)
print(np.maximum(x,y)) #元素级最大值
将条件逻辑表述为数组运算
numpy.where函数是三元表达式x condition else y 的矢量化版本
import numpy as np
xarr = np.array([1.1,1.2,1.3,1.4,1.5])
yarr = np.array([2.1,2.2,2.3,2.4,2.5])
cond = np.array([True,False,True,True,False])
result = np.where(cond,xarr,yarr)
print(result)
数学和统计方法
可以通过数组上的一组数据函数对整个数组或某个轴向的数据进行统计计算
约简:sum、mean以及标准差std等聚合计算,可以当做数组的实例方法调用,也可以当做顶级的NumPy函数使用
但是有的方法不聚合,如cumsum和cumrod,产生一个由中间结果组成的数组
import numpy as np
arr = np.random.randn(5,4)
print(arr.mean())
print(arr.sum())
print(arr.cumsum(0))
print(arr.cumprod(1))
np.save和np.load是读写磁盘数据的两个主要函数。默认情况下,数组是以未压缩的原始二进制格式保存在扩展名.npy的文件中
pandas
提供了使我们能够快速便捷地处理结构化数据的大量数据结构和函数,使Python成为强大而高效的数据分析环境的重要因素之一
pandas兼具Numpy高性能的数组计算功能以及电子表格和关系型数据库(如SQL)灵活的数据处理功能。它提供了复杂精细的索引功能,以便更为便捷地重塑、切片和切块、聚合以及选取数据子集等操作
DataFrame是pandas中最重要的数据结构,它用于将数据表示为一个表格
matplotlib
是最流行的用于绘制数据图表的Python库。提供了一种非常好用的交互式数据绘图环境。绘制的图表也是交互式,可以利用绘图窗口中的工具放大图表中的某个区域或对整个图表进行平移浏览
SciPy
是一组专门解决科学计算中各种标准问题域的包的集合,主要包括的包
编程或数据科学方面的常用术语
数据规整:指的是将非结构化和(或)散乱数据处理为结构化或简洁形式的整个过程。
伪码:算法或过程的“伪码式”描述,而这些代码本身并不是实际有效的源代码
语法糖:这是一种编程语法,它并不会带来新的特性,但却能使代码更易读、更易写
拓展
测试代码的执行时间:%time和%timeit
基本性能分析:%prun和%run -p
代码设计提示
喝口脉动吧
# 在一组值(网络型)上计算函数sqrt(x^2+y^2)
# np.meshgrid函数接受两个一维数组,
# 并产生两个二维矩阵(对应于两个数组中所有的(x,y)对)
import numpy as np
points = np.arange(-5,5,0.01) #1000个隔离点
xs,ys = np.meshgrid(points,points)
# 对函数的求值运算,把两个数组当做两个浮点数那样编写
# 表达式即可
import numpy as np
points = np.arange(-5,5,0.01) #1000个隔离点
xs,ys = np.meshgrid(points,points)
z = np.sqrt(xs ** 2 + ys ** 2)
print(z)