只需要注意,如果您正在執行一系列搜索,如果搜索維度不夠大,從外部循環中執行諸如轉換爲字符串這樣的巧妙操作所帶來的性能提升可能會丟失。看到迭代FIND1使用沿內軸使用argmax上面提出的字符串的轉換特技和find2的性能如何(加的調整,以確保不匹配返回爲-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)
輸出
(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寫的會比這兩種方法
是你建議我使用python迭代而不是ufunc?這比numpy更有效嗎? – cyborg
我不確定,我甚至不知道ufuncs。聽起來你已經比我更瞭解了! – wim