这个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中的实现相关推荐

  1. 对python3中pathlib库的Path类的使用详解

    原文连接   https://www.jb51.net/article/148789.htm 1.调用库 ? 1 from pathlib import 2.创建Path对象 ? 1 2 3 4 5 ...

  2. Python3中typing模块介绍

    typing.py的源码在:https://github.com/python/cpython/blob/main/Lib/typing.py.此模块为类型提示(Type Hints)提供运行时支持( ...

  3. Python3中内置函数callable介绍

          Python3中的内置函数callable接受一个对象参数,如果此对象参数看起来可调用,则callable函数返回True,否则返回False.如果返回True,则调用仍有可能失败:但如果 ...

  4. Python3中lambda表达式介绍

    Python3中的lambda表达式或lambda函数是匿名函数(anonymous function),意味着该函数没有名称.def关键字用于在Python3中创建一个普通函数,类似地,lambda ...

  5. Python3中collections.OrderedDict介绍

    Python3中的collections模块实现了特定目标的容器,以提供Python标准内建容器dict.list.set和tuple的替代选择,包括namedtuple.deque.ChainMap ...

  6. Python3中装饰器@typing.overload的使用

    typing.py的源码在:https://github.com/python/cpython/blob/main/Lib/typing.py .此模块为类型提示(Type Hints)提供运行时支持 ...

  7. Python3中闭包介绍

          Python3中的闭包(closure)是一个函数对象,它记住封闭作用域(enclosing function)中的值,即使它们不存在于内存中.它是一个将函数与环境一起存储的记录.由于闭包 ...

  8. oracle urlencode 中文,Python2和Python3中urllib库中urlencode的使用注意事项

    前言 在Python中,我们通常使用urllib中的urlencode方法将字典编码,用于提交数据给url等操作,但是在Python2和Python3中urllib模块中所提供的urlencode的包 ...

  9. Python3中的类和实例

    1.类和实例 类是抽象的模板,实例是根据类创建出来的一个个具体的"对象".例如:动物是一大类,猫.狗.鱼等都是特定的对象,即实例.python3中使用class关键字来定义类,基本 ...

最新文章

  1. WinAPI: GetSystemPowerStatus - 获取系统电源状态的信息
  2. malloc分配内存的原理?
  3. Windows服务编写综述
  4. html文字超链接不让变色,css不让超链接变色怎么设置?
  5. 前端技术选型最佳神器!
  6. 数字人民币App正式上线 京东子钱包推送量峰值增长超过20倍
  7. 8、技术分析fastJson使用
  8. ueditor去掉本地保存功能
  9. 推荐一款华为最新的自动化代码检查工具
  10. NavigationDuplicated: Avoided redundant navigation to current location: 解决办法
  11. 前后端分离API接口如何加密 —— AES加密方案
  12. 论文:DKN:Deep Knowledge-Aware Network for News Recommendatio
  13. as5300g2 nas软件功能_硬件与软件齐飞,首款支持2.5GbE的NAS-华芸AS-5202T测评体验
  14. liunx基础—zabbix5.0监控系统安装部署
  15. 随意细解:UI -- 初级数据持久化
  16. elastic search6.2.4配置同义词典synonys
  17. SSM毕设项目校园生活互助平台ep2p1(java+VUE+Mybatis+Maven+Mysql)
  18. qq红心头像[中国心]制作教程之Photoshop教程
  19. java服务linux系统cpu占用96以上问题解决方案
  20. VLSI数字信号处理系统——第五章展开

热门文章

  1. 东南大学计算机学院书记,东南大学计算机科学与工程学院硕导介绍:王红兵
  2. 【PC硬件】浅谈串口
  3. GNINX下配置WHMCS伪静态教程
  4. JSON和几个的全局异常处理
  5. 风控数据分析笔记-业务层面
  6. [4G5G专题-126]:5G培训部署篇-3-5G网络优化
  7. Missing type in composite literal
  8. 从零开始的腾讯云使用体验-3-修改pip源、虚拟环境配置与使用、pycharm同步linux环境和文件
  9. 《数据结构》树和二叉树代码整理(C语言实现)
  10. 狄杰斯特拉算法 vs A_star 算法