# index进阶操作

## 从index中恢复出原始数据

# 导入faiss
import sys
import numpy as np
sys.path.append('/home/maliqi/faiss/python/')
import faiss

#生成数据
d = 16
n_data = 500
data = np.random.rand(n_data, d).astype('float32')

index = faiss.IndexFlatL2(d)
re_data = index.reconstruct(0)  #指定需要恢复的向量的id,每次只能恢复一个向量
print(re_data)
re_data_n = index.reconstruct_n(0, 10) #从第0个向量开始，连续取10个
print(re_data_n.shape)
[0.58085376 0.5048806  0.99052334 0.5899147  0.5211166  0.35997516
0.7275415  0.1242122  0.08336558 0.48458952 0.3289773  0.905333
0.6513156  0.33422878 0.04078896 0.6842935 ]
(10, 16)

## 从index中移除向量

index = faiss.IndexFlatL2(d)
print(index.ntotal)
index.remove_ids(np.arange(5)) # 需要移除的向量的id
print(index.ntotal)  #移除了5个向量，还剩495个
500
495


## 搜索距离范围内的向量

index = faiss.IndexFlatL2(d)
dist = float(np.linalg.norm(data[3] - data[0])) * 0.99  # 定义一个半径/阈值
res_index = index.range_search(data[[49], :], dist)  #用第50个向量查询
print(res_index) #返回结果是一个三元组，分别是limit(返回的结果的数量), distance, index
res_index = index.range_search(data[[9], :], dist)  #用第10个向量查询
print(res_index) #返回结果是一个三元组，分别是limit(返回的结果的数量), distance, index
(array([0, 8], dtype=uint64), array([0.        , 1.165087  , 0.92170537, 0.9101888 , 1.2231735 ,
1.2296542 , 1.2302384 , 1.1056653 ], dtype=float32), array([ 49, 135, 150, 225, 266, 323, 484, 491]))
(array([ 0, 26], dtype=uint64), array([1.2187614 , 0.        , 1.2426732 , 0.82170576, 1.1128769 ,
0.8076687 , 1.2431146 , 0.9778436 , 1.2443304 , 1.1967008 ,
1.1036559 , 1.1283486 , 1.1076214 , 1.2520782 , 1.2406417 ,
1.2235129 , 1.0338147 , 1.1743065 , 0.9288659 , 1.1673778 ,
1.1726046 , 1.1790745 , 1.1337838 , 1.1365123 , 1.2428    ,
1.0492276 ], dtype=float32), array([  6,   9,  11,  15,  41,  47,  50,  58,  75, 104, 108, 112, 122,
135, 162, 169, 213, 236, 271, 290, 342, 434, 463, 467, 477, 479]))


## 拆分/合并index

nlist = 10
quantizer = faiss.IndexFlatL2(d)
index1 = faiss.IndexIVFFlat(quantizer, d, nlist)
index1.train(data)
index2 = faiss.IndexIVFFlat(quantizer, d, nlist)
index1.merge_from(index2, 250)
print(index1.ntotal) # 合并后应该包含500个向量
dis, ind = index1.search(data[:5], 10)
print(ind)

500
[[  0  28 382 194 286 114 308 480 254 279]
[  1 416 272 250 296 138 366 281  93 169]
[  2  44 491 231 178 285 117 273  83 187]
[  3 194  28 143 270 430 264 382 197 279]
[  4 464 317  89 325 498  83 101 285  51]]

11-21 2218

11-20 2692

12-20 37

07-16 340

05-12 118

06-22 2万+

07-16 238

11-20 2555

06-18 1691

01-08 377

10-30 442

05-05 141

07-11 961

07-01 1450

07-16 346

03-02 115

07-16 404

11-03 574

03-19 80万+

04-14 56万+

02-19 16万+

02-27 7万+

02-28 4万+

03-01 12万+

03-01 11万+

03-03 6200

03-04 12万+

03-05 9754

03-05 5万+

03-08 6万+

03-08 1万+

04-25 6万+

03-10 12万+

03-10 17万+

03-10 6380

03-12 10万+

03-13 10万+

03-16 1万+

03-19 7万+

03-20 5075

03-23 1万+

03-24 3万+

03-25 2万+

03-25 8万+

03-27 1万+

03-29 20万+

03-29 9万+

03-30 14万+

05-21 2931

03-31 1万+

05-25 5225

03-23 1万+

04-02 3万+

05-06 2万+

04-05 1万+

04-06 6万+

04-09 1万+

04-09 7万+

04-09 4719

04-10 4266

04-11 2万+

04-15 5万+

04-18 1万+

04-18 3795

04-18 4万+

04-20 3万+

04-24 2万+

04-26 3678

04-24 4138

04-30 7532

05-16 4万+

05-08 3万+

05-10 1920

05-11 3万+

05-13 6764

05-19 5689

05-13 9768

05-14 3673

05-14 6144

#### 微服务为什么一定要用docker？阿里架构师带你彻底了解docker

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客