本篇博客是主要是为:python 3.x实现特征选择ReliefF算法博友遇到的问题进行解答。
首先要对之前的对部分博友误导性回复说句抱歉。
之前由于自己懒,我自己电脑能跑通就没有去深究真正原因,就简单的以为是数据没有处理好的原因。
当我发现越来越多博友向我反馈这个问题时,我就开始怀疑之前对待这个问题的看法的正确性。
最近一个大哥又向我反馈了这个问题,我终于按捺不住了。我要出手了。
初探
报错:
ret = N.ndarray.new(subtype, shape, arr.dtype,
ValueError: ndarray is not contiguous
问题定位在numpy
,因为我的python3.7跑的通,一位老哥的3.8跑不通,所以以为是python解释器的问题,然后装了python3.8测试发现还是会报一样的问题。
解决方案
这种错误感觉不太好调试,经过一番搜索和测试找到了解决方案。只需要将下方代码简单修改即可:
# 原来代码
f = lambda x: cosSim(np.mat(x), np.mat(aim))
# 修正代码
f = lambda x: cosSim(np.mat(x.values), np.mat(aim.values))
原因:np.mat输入的数据 需要是 类数组的形式。
numpy官方文档地址:https://numpy.org/doc/stable/reference/generated/numpy.mat.html?highlight=mat#numpy.mat
感谢提供方案的地址:https://www.pythonheidong.com/blog/article/469787/fed6384e2c06d169dac8/
再探索
但是为什么我在python3.7跑没有问题?
那肯定是numpy版本的原因了!
经过测试,的确是这样!!!
- 没问题版本:
- 出现问题的版本:
其他问题
可能遇到的其他问题
UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xb1 in position 0: invalid start byte
很明显编码不正确,尝试换种编码打开,比如常用的utf-8
,gbk
等。
获取文件编码
之前自己做项目有这个需求,就接触到了一个工具包。现在分享给大家。
安装chardet包,当时我封装的获取文件编码的接口如下:
from chardet.universaldetector import UniversalDetector
def get_file_encoding(file):
with open(file, mode='rb') as f:
detector = UniversalDetector()
for line in f:
detector.feed(line)
if detector.done:
break
detector.close()
return detector.result['encoding']
感想
当用一个官方的东西的时候很有必要细读它的官方文档。