Просто обратите внимание, что если вы выполняете последовательность поисков, выигрыш в производительности от выполнения чего-то умного, такого как преобразование в строку, может быть потерян во внешнем цикле, если измерение поиска недостаточно велико.Посмотрите, как производительность итерации find1, которая использует предложенный выше трюк преобразования строк, и find2, которая использует argmax вдоль внутренней оси (плюс корректировка для обеспечения того, что несоответствие возвращает как -1)
import numpy,time
def find1(arr,value):
return (arr==value).tostring().find('\x01')
def find2(arr,value): #find value over inner most axis, and return array of indices to the match
b = arr==value
return b.argmax(axis=-1) - ~(b.any())
for size in [(1,100000000),(10000,10000),(1000000,100),(10000000,10)]:
print(size)
values = numpy.random.choice([0,0,0,0,0,0,0,1],size=size)
v = values>0
t=time.time()
numpy.apply_along_axis(find1,-1,v,1)
print('find1',time.time()-t)
t=time.time()
find2(v,1)
print('find2',time.time()-t)
output
(1, 100000000)
('find1', 0.25300002098083496)
('find2', 0.2780001163482666)
(10000, 10000)
('find1', 0.46200013160705566)
('find2', 0.27300000190734863)
(1000000, 100)
('find1', 20.98099994659424)
('find2', 0.3040001392364502)
(10000000, 10)
('find1', 206.7590000629425)
('find2', 0.4830000400543213)
Тем не менее, находка, написанная на C, будет, по крайней мере, немного быстрее, чем любой из этих подходов