使用index.add_with_ids为每个向量对应一个的id,报错:in method 'IndexIVFFlat_add_with_ids', argument 4 of type 'faiss::Index::idx_t const *'
(错误)代码如下:
import faiss
import numpy as np
d = 512
n_data = 2000
data = np.random.rand(n_data, d).astype('float32')
ids = np.arange(100000, 102000)
nlist = 10
quantizer = faiss.IndexFlatIP(d)
index = faiss.IndexIVFFlat(quantizer, d, nlist, faiss.METRIC_L2)
index.train(data)
index.add_with_ids(data, ids)
返回的错误是:
Traceback (most recent call last):
File "G:/xxxx/IndexConstruction.py", line 53, in <module>
index.add_with_ids(data, ids)
File "D:\xxxxx\python36\lib\site-packages\faiss\__init__.py", line 112, in replacement_add_with_ids
self.add_with_ids_c(n, swig_ptr(x), swig_ptr(ids))
File "D:\xxxxx\Anaconda\envs\python36\lib\site-packages\faiss\swigfaiss_avx2.py", line 3617, in add_with_ids
return _swigfaiss_avx2.IndexIVFFlat_add_with_ids(self, n, x, xids)
TypeError: in method 'IndexIVFFlat_add_with_ids', argument 4 of type 'faiss::Index::idx_t const *'
原因是:ids 的格式必须转换为 int64,只需要添加这行代码:
ids = np.array(ids).astype('int64')
修改过的代码是:
import faiss
import numpy as np
d = 512
n_data = 2000
data = np.random.rand(n_data, d).astype('float32')
ids = np.arange(100000, 102000)
ids = np.array(ids).astype('int64')
nlist = 10
quantizer = faiss.IndexFlatIP(d)
index = faiss.IndexIVFFlat(quantizer, d, nlist, faiss.METRIC_L2)
index.train(data)
index.add_with_ids(data, ids)
这次没有报错。