Что у меня есть:
- numpy матрица,
size = (n, m)
- имена строк,
size = n
Что я хочу:
- Создать файл HDF5,
- сохранить numpy матрицу с именами строк правильно.
- использовать этот файл hdf5 для вычисления косинусного сходства между двумя векторами / матрицами.
Размер этих векторов / матриц всегда различен.
Что я пробовал:
import h5py
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
vecs = np.random.rand(50000, 150)
names = np.random.choice(range(10000, 100000), size=50000)
# hdf5 way
with h5py.File('test.h5', mode='w', libver='latest') as f:
f.create_dataset('vectors', shape=(150,), dtype=np.float16, compression='gzip', compression_opts=9)
for name, vec in zip(names, vecs):
f.attrs[str(name)] = vec
# memory-map way
mmap = np.memmap(filename='test.mymemmap', shape=(50000, 150), dtype='float16', mode='w+', order='F')
name_ind = dict()
for i, (name, vec) in enumerate(zip(names, vecs)):
mmap[i] = vec
name_ind[name] = i
# test case
target_name = np.random.choice(names, size=1)
target_names = np.random.choice(names, size=10000)
# 1-2 sec on my pc
with h5py.File('test.h5','r') as f:
a = f['vectors']
vec1 = f.attrs[str(target_name[0])]
vecs2 = [f.attrs[str(name)] for name in target_names]
cosine_similarity(vec1[np.newaxis], vecs2)[0]
# 0.04-0.05 sec on my pc
ind1 = name_ind[target_name[0]]
inds2 = [name_ind[name] for name in target_names]
vec1 = mmap[ind1]
vecs2 = mmap[inds2]
cosine_similarity(vec1[np.newaxis], vecs2)[0]