Skip to content

Pythonクイックスタート

masajiro edited this page Nov 25, 2019 · 1 revision

インストール

Python バインディング (ngtpy) は以下のようにインストールします。

pip3 install ngt

インデックスの初期化とデータ登録

以下はインデックスの初期化とデータ登録の例です。

# create-simple.py
import ngtpy

with open('./data/sift-dataset-5k.tsv', 'r', newline='\n') as fin:
    ngtpy.create('anng', 128)   # create an empty index
    index = ngtpy.Index('anng') # open the index
    for line in fin:
        object = list(map(float, line.rstrip().split('\t')))
        index.insert(object[:128]) # append objects to the index
index.build_index() # build index
index.save() # save the index

ngtpy.create() は指定されたディレクトリ anng を生成し、インデックスとして初期化します。 ngtpy.Index() はインデックスをオープンします。 ./data/sift-dataset-5k.tsv は登録するオブジェクトのオブジェクトファイルです。 その各行は各オブジェクトです。 そのファイルには各オブジェクトの後ろに追加データがあるので、object[:128]のように登録前に追加データを削除します。 ngtpy.Index.insert() はオブジェクトをインデックスに追加します。 ngtpy.Index.build_index() は追加オブジェクトのエントリをインデックスに生成します。 ngtpy.Index.save() はインデックスを保存します。

上記例を以下のコマンドで実行します。

cd (NGT_TOP_DIR)
python3 create-simple.py

近傍検索

以下は近傍検索の例です。

# search-simple.py
import ngtpy

index = ngtpy.Index('anng', read_only = True, zero_based_numbering = False) # open the index
with open('./data/sift-query-3.tsv', 'r', newline='\n') as fin:
    for i, line in enumerate(fin):
	query_object = list(map(float, line.rstrip().split('\t')))
        result = index.search(query_object, 5) # nearest neighbor search
	print('Query No.{}'.format(i + 1))
        print('Rank\tID\tDistance')
        for rank, object in enumerate(result):
            print('{}\t{}\t{:.6f}'.format(rank + 1, object[0], object[1]))
        print()

./data/sift-query-3.tsv はクエリオブジェクトからなります。フォーマットは登録オブジェクトファイルと同じです。このファイルは3つのクエリからなるので、これらのクエリで検索された3つの結果が表示されます。検索結果数5はngtpy.Index.search()の2つの引数で指定されています。

Query No.1
Rank    ID      Distance
1       3031    239.332397
2       4079    240.002090
3       3164    244.503586
4       3718    246.763046
5       157     251.093613
    ...