下载 https://www.python.org/downloads/release/python-2710/ ,64 位操作系
统选择 Windows x86_64 MSI installer,32 位操作系统选择 Windows x86 MSI
installer
双击安装(最好选择默认路径)
a. 下载 https://pypi.python.org/pypi/pip/ ,选择 pip-8.1.1.tar.gz,解压。大命令行
Step 2:安装包管理器 pip
进入 dist\pip-8.1.1
b. 运行 python setup.py install
c. 修改环境变量 PATH,添加 C:\Python27\Scripts
Step 3:使用包管理器安装 numpy、scipy
NumPy 和 SciPy 在 windows 下需要手动安装,否则容易出现意外的错误。过程如下
a. 从 http://www.lfd.uci.edu/~gohlke/pythonlibs/ 下载相应 whl 包(下载 python2.7
版本 cp27,32 位下载 win32,64 位下载 win_amd64)手动安装,手动安装注意依赖
关系
一、Introduction
1. 安装Numpy 与SciPy
(1)使用 Python 发行包
常见的 Python 发行包:
Enthought Python Distribution (EPD)
ActivePython (AP)
Python(x,y)
(2)Python Windows
Step1:安装 Python
b. pip install wheel
c. pip install xxxxx.whl
Step 4:安装其他包
pip install pillow
pip install pandas
pip install -U scikit-learn
pip install matplotlib
pip install ipython
pip install pyreadline
(3)Python OS X
Step 1:安装 homebrew
Step 2:重新安装 python
brew install python
Step 3:安装 pip
sudo easy_install pip
Step 4:安装其他包
/usr/bin/ruby -e "$(curl -fsSL
https://raw.githubusercontent.com/Homebrew/install/master/install)"
pip install numpy
pip install scipy
pip install pillow
pip install pandas
pip install -U scikit-learn
pip install matplotlib
pip install ipython
二、Numpy
1. numpy 数组与 python 列表效率对比
import numpy as np
# 创建大小为 10^7 的数组
arr = np.arange(1e7)
larr = arr.tolist()
def list_times(alist, scalar):
for i, val in enumerate(alist):
alist[i] = val * scalar
return alist
# 利用 IPython 的魔术方法timeit 计算运行时间
timeit arr * 1.1
>>> 1 loops, best of 3: 76.9 ms per loop
timeit list_times(larr, 1.1)
>>> 1 loops, best of 3: 2.03 s per loop
2. 创建数组并设置数据类型
(1)从列表转换
alist = [1, 2, 3]
arr = np.array(alist)
(2)np.arange()
arr = np.arange(100)
arr = np.arange(10,100)
(3)np.zeros()
arr = np.zeros(5)
np.zeros((5,5))
cube = np.zeros((5,5,5)).astype(int) + 1
cube = np.ones((5, 5, 5)).astype(np.float16)
arr = np.zeros(2, dtype=int)
arr = np.zeros(2, dtype=np.float32)
(4)reshape()
arr1d = np.arange(1000)
arr3d = arr1d.reshape((10,10,10))
arr3d = np.reshape(arr1s, (10, 10, 10))
(5)revel()
(6)shape
作用与 reshape 相反
显示数据对象的形状
arr1d.shape
注意:对数据形状结构的改变只是改变了数据的显示形式,即只是改变了数据的引用,
对一个数据的改变另一个也会被改变。
3. 记录数组
(1)创建记录数组并赋值
recarr = np.zeros((2,), dtype=('i4,f4,a10'))
#创建大小为2 的记录数组,类型为4 字节整数、4 字节浮点数和10 字节字符
recarr[:] = [(1,2.,'Hello'),(2,3.,"World")]
(2)使用 zip()
recarr = np.zeros((2,), dtype=('i4,f4,a10'))
col1 = np.arange(2) + 1
col2 = np.arange(2, dtype=np.float32)
col3 = ['Hello', 'World']
recarr[:] = zip(col1, col2, col3)
recarr.dtype.names = ('Integers' , 'Floats', 'Strings')
(3)为每列数据命名
(4)使用列名访问数据
recarr('Integers')
4. 索引和切片
(1)numpy 提供了类似于 matlab 的索引和切片
alist=[[1,2],[3,4]]
alist[0][1]
arr = np.array(alist)
arr[0,1]
arr[:,1]
arr[1,:]
#python 方式
#单个元素
#第1 列
#第1 行
(2)np.where()
根据条件获取索引号
index = np.where(arr>2)
new_arr = arr[index]
new_arr = np.delete(arr, index)
也可以这样操作:
index = arr > 2
new_arr = arr[index]
注意:第二种方法速度更快,而且可以用“∼ index”很容易的得到与 index 相反的
#得到一个逻辑数组
逻辑数组。
5. NumPy 数组的布尔操作
NumPy 数组元素可以通过逻辑表达式方便的操作
例:
# 创建如Plot A 所示的数组
img1 = np.zeros((20, 20)) + 3
img1[4:-4, 4:-4] = 6
img1[7:-7, 7:-7] = 9
# 获取数值大于2 且小于6 的元素索引
index1 = img1 > 2
index2 = img1 < 6
compound_index = index1 & index2
# 上式与下式结果相同
compound_index = (img1 > 3) & (img1 < 7)
img2 = np.copy(img1)
img2[compound_index] = 0
# 得到 Plot B.
# 更复杂的数组逻辑操作
index3 = img1 == 9
index4 = (index1 & index2) | index3
img3 = np.copy(img1)
img3[index4] = 0 # 得到 Plot C.
例:
import numpy.random as rand
a = rand.randn(100)
index = a > 0.2
b = a[index]
b = b ** 2 – 2
a[index] = b
6. 读写操作
(1)Python 读写文本文件
f = open('somefile.txt', 'r')
alist = f.readlines()
file f.close()
#以只读方式打开文件,'r'表示读
#将文件内容读入列表,每一行为一个列表元素
#关闭文件
f = open('newtextfile.txt', 'w') #以可写方式打开文件,'w'表示写
f.writelines(newdata)
f.close()
#写入数据
#关闭文件
注意:读写完毕之后要将文件关闭
(2)Numpy 文件文件读写
Python 读写文件文件虽然方便且效率很好,但是不太适合处理极大的文件。当文件
内容有结构,且为数字时用 NumPy 处理,存 numpy.ndarray 会更合适。
例:
import numpy as np
arr = np.loadtxt('somefile.txt')
np.savetxt('somenewfile.txt')
如果文件各列数据类型不一样,则需要指明数据类型,NumPy 用来保存数据的类
型为 recarray,可以用处理 ndarray 同样的方法来对元素进行操作。recarray 数据类型
不能直接保存为文本文件,如果需要的话可以使用 matplotlib.mlab 实现。
例:
文件 example.txt 内容如下
XR21 32.789 1
XR22 33.091 2
读入数据
table = np.loadtxt('example.txt',
dtype='names': ('ID', 'Result', 'Type'),
'formats': ('S4', 'f4', 'i2'))
提示:如果文本数据为 ASCII 格式的,使用 Asciitable 包读写会更加高效。
(3)二进制文件
文本文件处理简单方便,但是读写速度和文件大小都不能和二进制文件相比,因此
大数据处理适合使用二进制文件。
例:
import numpy as np
data = np.empty((1000, 1000))
np.save('test.npy', data)
np.savez('test.npz', data)
newdata = np.load('test.npy')
#创建一个较大的数组
#保存数据
#压缩保存数据
#读入数据
注意:NumPy 使用 numpy.save 和 numpy.load 来读写二进制文件,但这种二进制文件
只能在 NumPy 下读写,scipy.io 可以处理更通用的二进制文件
7. 数学运算
(1)线性代数
NumPy 数组间的运算只是相对应元素间的远算,不能用运算符进行矩阵运算,可
以使用 numpy.dot 和 numpy.transpose 分别来进行矩阵乘法运算和矩阵转置。其优点
在于常规操作时避免了对数据遍历。
NumPy 的 matrix 类型则可以直接用运算符号进行运算。
例:使用 matrix 解方程组
#定义矩阵
#求方程组
import numpy as np
A = np.matrix([[3, 6, -5], [1, -3, 2], [5, -1, 4]])
B = np.matrix([[12], [-2], [10]])
X = A ** (-1) * B
print(X)
例:使用数组解方程组
import numpy as np
a = np.array([[3, 6, -5], [1, -3, 2], [5, -1, 4]])
b = np.array([12, -2, 10])
x = np.linalg.inv(a).dot(b)
print(x)
注意:数组的运算速度更快,而且为了在使用中保持数据类型一致,建议使用数组。
三、SciPy
1. 最优化
(1)数据建模和拟合
SciPy 函数 curve_fit 使用基于卡方的方法进行线性回归分析。下面,首先使用
f(x)=ax+b 生成带有噪声的数据,然后使用用 curv_fit 来拟合。
例:线性回归
import numpy as np
from scipy.optimize import curve_fit
# 创建函数f(x)=ax+b
def func(x, a, b):
return a * x + b
# 创建干静数据
x = np.linspace(0, 10, 100)
y = func(x, 1, 2)
# 添加噪声
yn = y + 0.9 * np.random.normal(size=len(x))
# 拟合噪声数据
popt, pcov = curve_fit(func, x, yn)
# 输出最优参数
print(popt)
例:高斯分布拟合
# 创建函数
def func(x, a, b, c):
return a*np.exp(-(x-b)**2/(2*c**2))
# 生成干静数据
x = np.linspace(0, 10, 100)
y = func(x, 1, 5, 2)
# 添加噪声
yn = y + 0.2 * np.random.normal(size=len(x))
# 拟合
popt, pcov = curve_fit(func, x, yn)
(2)函数求解
例:线性函数求解
SciPy 的 optimize 模块中有大量的函数求解工具,fsolve 是其中最常用的。
from scipy.optimize import fsolve
import numpy as np
line = lambda x: x + 3
solution = fsolve(line, -2)
print solution
例:求函数交叉点
from scipy.optimize import fsolve
import numpy as np
# 用于求解的解函
def findIntersection(func1, func2, x0):
return fsolve(lambda x : func1(x) - func2(x), x0)
# 两个函数
funky = lambda x : np.cos(x / 5) * np.sin(x / 2)
line = lambda x : 0.01 * x - 0.5
x = np.linspace(0,45,10000)
result = findIntersection(funky, line, [15, 20, 30, 35, 40, 45])
# 输出结果
print(result, line(result))
2. 插值
(1)interp1d
例:正弦函数插值
import numpy as np
from scipy.interpolate import interp1d
# 创建待插值的数据
x = np.linspace(0, 10 * np.pi, 20) y = np.cos(x)
# 分别用linear 和quadratic 插值
fl = interp1d(x, y, kind='linear')
fq = interp1d(x, y, kind='quadratic')
xint = np.linspace(x.min(), x.max(), 1000)