Вот метод, основанный на searchsorted
, который быстро и легко применим к партиям векторов:
Время для 4, 12 и 26 классов и партий по 1000 векторов длины 2. broadcast
равно @метод coldspeed.
4
broadcast : 0.248 ms
searchsorted: 0.095 ms
12
broadcast : 0.468 ms
searchsorted: 0.119 ms
26
broadcast : 0.748 ms
searchsorted: 0.137 ms
Код:
import numpy as np
from string import ascii_lowercase
def broadcast(test, classes):
return (test[..., None] == classes).any(-2).view(np.uint8)
def searchsorted(test, classes):
X = classes.argsort()
out = np.zeros((*test.shape[:-1], classes.size), np.uint8)
idx = np.ogrid[tuple(map(slice, out.shape))]
idx = *idx[:-1], X[classes[X].searchsorted(test)]
out[idx] = 1
return out
letters = np.fromiter(ascii_lowercase, 'U1', 26)
np.random.shuffle(letters)
def make_test(n=26, shp=(1000,)):
v = np.random.randint(0, n, shp)
w = (np.random.randint(0, n-1, shp) + 1 + v) % n
d = len(shp)
return letters[:n], letters[np.r_[f'{d},{d+1},0', v, w]]
from timeit import timeit
def test_it(f, args, n=1000, format='{0.__name__:12s}: {1:10.3f} ms'.format):
res = timeit('f(*args)', globals=dict(f=f, args=args), number=n) * 1000/n
return res, format(f, res)
for k in [4, 12, 26]:
T, L = make_test(k)
print(k)
for f in [broadcast, searchsorted]:
t, msg = test_it(f, (L, T))
print(msg)