Я абсолютный новичок в Python, но, похоже, мой комментарий был неправильным, но я "наберусь" и признаю это и скажу, как я это разработал, и, возможно, кто-то узнает почему.Прежде чем кто-то скажет, что это не ответ, это так, потому что он улучшает исходный код (в функции loop()
), вводя улучшенную функцию loop2()
:
#!/usr/local/bin/python3
import numpy as np
# Generate an array 40x40 of random integers <100
image=np.random.randint(100,size=(40,40))
# List of pixels we like
vectorlist=[[0,0],[1,1],[1,0],[39,39]]
# Boolean mask of elements we like
mask=np.reshape(np.zeros(1600,dtype=bool),(40,40))
mask[0,0]=mask[1,1]=mask[1,0]=mask[39,39]=True
# OP's suggested method
def loop():
a=[]
for i in range(0,len(vectorlist)):
a.append(image[vectorlist[i][0],vectorlist[i][1]])
mi=min(a)
ma=max(a)
return(mi,ma)
# Slight improvement on OP's method
def loop2():
# Don't add a bunch of items to a list we don't need
mi=ma=image[vectorlist[0][0],vectorlist[0][1]]
for i in range(1,len(vectorlist)):
this=image[vectorlist[i][0],vectorlist[i][1]]
if this>ma:
ma=this
elif this<mi:
mi=this
return (mi,ma)
# My very own slow method using a masked array
def masked():
selpix=image[mask]
mi=np.amin(selpix)
ma=np.amax(selpix)
return (mi,ma)
print(loop())
print(loop2())
print(masked())
Пример вывода
(22, 91)
(22, 91)
(22, 91)
Я вставил все вышеперечисленное в IPython
, а затем провел следующие временные тесты:
In [178]: %timeit loop()
1.96 µs ± 6 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [179]: %timeit loop2()
1.4 µs ± 2.21 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [180]: %timeit masked()
4.64 µs ± 32.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
Разочарован в Челтенхэме: -)