logo资料库

NumPy中文文档.pdf

第1页 / 共28页
第2页 / 共28页
第3页 / 共28页
第4页 / 共28页
第5页 / 共28页
第6页 / 共28页
第7页 / 共28页
第8页 / 共28页
资料共28页,剩余部分请下载后查看
下载 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)
分享到:
收藏