Flann在python3中的实现
这个pyhton2和python3不兼容实在是太要命了!!!血坑!!!
安装
- pip install pyflann
- conda install numpy
适配
网上有很多方法是这样的:
sudo 2to3 -w [pyflann directory in dist-packages]
但是我在实际操作中还是不行,但是也有人是成功的
flann不能运行的原因其实主要分成两大类,一类是因为文件导入错误,另一类是因为 python2 中的语法在 python3 中不适配!
一、修改导入规则
1.1 错误概况
类似于 ModuleNotFoundError: No module named 'xxxxx'
的错误都是因为导入方式不对,需要修改导入规则,大部分是将 from xxx import *
改为 from .xxx import *
,也有部分例外,会在下面说明。
1.2 涉及到的文件
__init__.py
改为:index.py
改为:bindings\__init__.py
改为:io\__init__.py
改为:io\dataset.py
改为: 将 31-33 行改为from . import xxxxx
的形式
二、修改语法
2.1 错误概况
类似于 SyntaxError: invalid syntax
的错误都是因为部分 python2 的语法在 python3 中是错误的,需要修改语法,大部分是将 except Exception, e
改为 except Exception as e
,也有其他的语法错误,会在下面一一说明。
2.2 涉及到的文件
bindings\flann_ctypes.py
改: 151 行 将except Exception, e
替换为except Exception as e
,201 行exec
语句加上括号,53 、78 行 将dict.iteritems()
替换为dict.items()
结果如下:
io\dataset.py
改: 61 行 将except Exception, e
替换为except Exception as e
结果如下:
io\hdf5_dataset.py
改: 34、67、85 行 将except Exception, e
替换为except Exception as e
结果如下:
三、使用
3.1 建立 Flann 并测试使用
###python3
import pyflann
import pickle
import numpy as np# 生成数据
train_n = 100000
test_n = 500
feature_number = 500train_data = np.random.rand(train_n, feature_number)
test_data = np.random.rand(test_n, feature_number)# 设置distance type
pyflann.set_distance_type("euclidean")# 建立FLANN类
flann = pyflann.FLANN()# 建立索引并分类
branching = 10
params = flann.build_index(train_data, algorithm='kmeans',target_precision=0.9, branching = branching , log_level='info')# 测试
top_k_results = 20
# sims: 500 * 20 每行代表一个test data,第k列是对应test data的TOP-k 结果
# dists: 500 * 20 每行代表一个test data, 第k列是test data 和 top-k result 的距离
sims, dists = flann.nn_index(test_data, top_k_results, checks = params['checks'])# 保存
pickle.dump(params,open('params.pk','wb'))
flann.save_index(b'flann_index')
# Or
# flann_filename = 'flann_index'
# flann.save_index(bytes(flann_filename, encoding='utf8'))
3.2 读取已经建立好的 FLANN,并使用
import pickle
import pyflann
import numpy as np# 读取上次的train_data
train_data = np.load(...)# 从文件读取 flann
pyflann.set_distance_type("euclidean")
flann = pyflann.FLANN()params = pickle.load(open('params.pk','rb'))
flann.load_index(b'flann_index', train_data)
# Or
# flann_filename = 'flann_index'
# flann.load_index(bytes(flann_filename, encoding='utf8'), train_data)# 使用
newData = np.random.rand(200,500)
topk = 20sims, dists = flann.nn_index(newData, topk, checks=params['checks'])
参考
[1] https://blog.csdn.net/qq_28824831/article/details/85003851
[2] https://blog.csdn.net/zhaojizhinex/article/details/104894344
[3] https://download.csdn.net/download/Wolf_xujie/18940725
修改好的包
官方文档
Flann在python3中的实现相关推荐
- 对python3中pathlib库的Path类的使用详解
原文连接 https://www.jb51.net/article/148789.htm 1.调用库 ? 1 from pathlib import 2.创建Path对象 ? 1 2 3 4 5 ...
- Python3中typing模块介绍
typing.py的源码在:https://github.com/python/cpython/blob/main/Lib/typing.py.此模块为类型提示(Type Hints)提供运行时支持( ...
- Python3中内置函数callable介绍
Python3中的内置函数callable接受一个对象参数,如果此对象参数看起来可调用,则callable函数返回True,否则返回False.如果返回True,则调用仍有可能失败:但如果 ...
- Python3中lambda表达式介绍
Python3中的lambda表达式或lambda函数是匿名函数(anonymous function),意味着该函数没有名称.def关键字用于在Python3中创建一个普通函数,类似地,lambda ...
- Python3中collections.OrderedDict介绍
Python3中的collections模块实现了特定目标的容器,以提供Python标准内建容器dict.list.set和tuple的替代选择,包括namedtuple.deque.ChainMap ...
- Python3中装饰器@typing.overload的使用
typing.py的源码在:https://github.com/python/cpython/blob/main/Lib/typing.py .此模块为类型提示(Type Hints)提供运行时支持 ...
- Python3中闭包介绍
Python3中的闭包(closure)是一个函数对象,它记住封闭作用域(enclosing function)中的值,即使它们不存在于内存中.它是一个将函数与环境一起存储的记录.由于闭包 ...
- oracle urlencode 中文,Python2和Python3中urllib库中urlencode的使用注意事项
前言 在Python中,我们通常使用urllib中的urlencode方法将字典编码,用于提交数据给url等操作,但是在Python2和Python3中urllib模块中所提供的urlencode的包 ...
- Python3中的类和实例
1.类和实例 类是抽象的模板,实例是根据类创建出来的一个个具体的"对象".例如:动物是一大类,猫.狗.鱼等都是特定的对象,即实例.python3中使用class关键字来定义类,基本 ...
最新文章
- WinAPI: GetSystemPowerStatus - 获取系统电源状态的信息
- malloc分配内存的原理?
- Windows服务编写综述
- html文字超链接不让变色,css不让超链接变色怎么设置?
- 前端技术选型最佳神器!
- 数字人民币App正式上线 京东子钱包推送量峰值增长超过20倍
- 8、技术分析fastJson使用
- ueditor去掉本地保存功能
- 推荐一款华为最新的自动化代码检查工具
- NavigationDuplicated: Avoided redundant navigation to current location: 解决办法
- 前后端分离API接口如何加密 —— AES加密方案
- 论文:DKN:Deep Knowledge-Aware Network for News Recommendatio
- as5300g2 nas软件功能_硬件与软件齐飞,首款支持2.5GbE的NAS-华芸AS-5202T测评体验
- liunx基础—zabbix5.0监控系统安装部署
- 随意细解:UI -- 初级数据持久化
- elastic search6.2.4配置同义词典synonys
- SSM毕设项目校园生活互助平台ep2p1(java+VUE+Mybatis+Maven+Mysql)
- qq红心头像[中国心]制作教程之Photoshop教程
- java服务linux系统cpu占用96以上问题解决方案
- VLSI数字信号处理系统——第五章展开