python中的setdefaultencoding函数使用

本文探讨了Python中如何正确设置字符编码,特别是在使用sys模块的setdefaultencoding方法时的注意事项。文章解释了为何需要重新加载sys模块才能成功设置默认编码。
#!/usr/bin/env python    
#encoding: utf-8  
import sys   #引用sys模块进来,并不是进行sys的第一次加载  
reload(sys)  #重新加载sys  
sys.setdefaultencoding('utf8')  ##调用setdefaultencoding函数

可以正确的执行,可是下面的代码会出错

#!/usr/bin/env python    
#encoding: utf-8  
import sys     
sys.setdefaultencoding('utf8') 

要在调用setdefaultencoding时必须要先reload一次sys模块,因为这里的import语句其实并不是sys的第一次导入语句,也就是说这里其实可能是第二、三次进行sys模块的import,这里只是一个对sys的引用,只能reload才能进行重新加载。

那么为什么要重新加载,而直接引用过来则不能调用该函数呢?因为setdefaultencoding函数在被系统调用后被删除了,所以通过import引用进来时其实已经没有了,所以必须reload一次sys模块,这样setdefaultencoding才会为可用,才能在代码里修改解释器当前的字符编码。

在python安装目录的Lib文件夹下,有一个叫site.py的文件,在里面可以找到main() --> setencoding()-->sys.setdefaultencoding(encoding),因为这个site.py每次启动python解释器时会自动加载,所以main函数每次都会被执行,setdefaultencoding函数一出来就已经被删除了。

Python中,可以使用`scipy.spatial.distance`模块中的`mahalanobis`函数来计算马氏距离。以下是一个使用函数的示例代码,该代码来自引用[1]: ```python # encoding::utf-8 # 马氏距离 from scipy.spatial import distance import numpy as np from numpy.linalg import inv SIGMA = np.array([[2, 1], [1, 2]]) q = [0, 0] x_1 = [-3.5, -4] x_2 = [2.75, -1.5] d_1 = distance.mahalanobis(q, x_1, inv(SIGMA)) d_2 = distance.mahalanobis(q, x_2, inv(SIGMA)) print(d_1) print(d_2) ``` 此外,也可以通过自定义函数来实现马氏距离的计算,如引用[3]和引用[4]中的代码所示。引用[3]中的自定义函数代码如下: ```python # encoding: utf-8 from __future__ import division import sys reload(sys) sys.setdefaultencoding('utf-8') import numpy as np def mashi_distance(x, y): print x print y # 马氏距离要求样本数要大于维数,否则无法求协方差矩阵 # 此处进行转置,表示10个样本,每个样本2维 X = np.vstack([x, y]) print X XT = X.T print XT # 方法一:根据公式求解 S = np.cov(X) # 两个维度之间协方差矩阵 SI = np.linalg.inv(S) # 协方差矩阵的逆矩阵 # 马氏距离计算两个样本之间的距离,此处共有4个样本,两两组合,共有6个距离。 n = XT.shape[0] d1 = [] for i in range(0, n): for j in range(i + 1, n): delta = XT[i] - XT[j] d = np.sqrt(np.dot(np.dot(delta, SI), delta.T)) print d d1.append(d) if __name__ == '__main__': # 第一列 x = [3, 5, 2, 8] # 第二列 y = [4, 6, 2, 4] mashi_distance(x, y) ``` 引用[4]中的自定义函数代码如下: ```python # encoding='utf-8’ import numpy as np def mas_distance(target_matrix, comp1=0, comp2=-1): mas_dis = np.mat(0) C1 = np.mat(target_matrix[comp1]) C2 = np.mat(target_matrix[comp2]) P1 = C1 - C2 S = np.cov(target_matrix, rowvar=0) P2 = np.linalg.inv(S) P3 = P1.T mas_dis = P1 * P2 * P3 return np.sqrt(mas_dis[0, 0]) # matrix = np.empty(shape=[0, 3]) # matrix = np.append(matrix, np.array([10, 15, 29]).reshape(1, 3), axis=0) # matrix = np.append(matrix, np.array([15, 46, 13]).reshape(1, 3), axis=0) # matrix = np.append(matrix, np.array([23, 21, 30]).reshape(1, 3), axis=0) # matrix = np.append(matrix, np.array([11, 9, 35]).reshape(1, 3), axis=0) # print(matrix) # print(mas_distance(matrix, 1)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值