首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >faiss:如何通过id从python检索向量

faiss:如何通过id从python检索向量
EN

Stack Overflow用户
提问于 2022-01-07 16:53:01
回答 1查看 1.4K关注 0票数 0

我有一个faiss索引,希望在python脚本中使用一些嵌入。嵌入的选择应该由id来完成。由于faiss是用C++编写的,所以使用swig作为API。

我想我需要的函数是重建

代码语言:javascript
复制
/** Reconstruct a stored vector (or an approximation if lossy coding)
     *
     * this function may not be defined for some indexes
     * @param key         id of the vector to reconstruct
     * @param recons      reconstucted vector (size d)
     */
    virtual void reconstruct(idx_t key, float* recons) const;

因此,我在python中调用此方法,例如:

代码语言:javascript
复制
vector = index.reconstruct(0)

但这会导致以下错误:

向量= index.reconstruct(0)文件"lib/python3.8/site-packages/faiss/swigfaiss.py",行406,在replacement_reconstruct self.reconstruct_c(key,swig_ptr(x))文件“lib/python3.8/site-packages/faiss/swigfaiss.py”,行1897中,在重构返回_swigfaiss.IndexFlat_reconstruct(self,key,recon)中 TypeError:在方法‘IndexFlat_重构’中,'faiss::Index::idx_t‘python类型的参数2。

有人知道我的方法有什么问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-10 11:57:52

这是我手动找到的唯一方法。

代码语言:javascript
复制
import faiss
import numpy as np

a = np.random.uniform(size=30)
a = a.reshape(-1,10).astype(np.float32)
d = 10
index = faiss.index_factory(d,'Flat', faiss.METRIC_L2)
index.add(a)

xb = index.xb
print(xb.at(0) == a[0][0])

输出:

代码语言:javascript
复制
True

你可以用循环得到任何向量

代码语言:javascript
复制
required_vector_id = 1
vector = np.array([xb.at(required_vector_id*index.d + i) for i in range(index.d)])
    
print(np.all(vector== a[1]))

输出:

代码语言:javascript
复制
True
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70624600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档