Wenn Sie ein Video verarbeiten, möchten Sie möglicherweise n aufeinanderfolgende Frames puffern. Wenn Sie also den Puffer rollen und verwenden möchten, müssen Sie den Index des Puffers verschieben.
Bei der Verarbeitung mit Numpy gibt es meiner Meinung nach die folgenden zwei Verarbeitungsmethoden.
Ich möchte die schnellstmögliche Verarbeitungsmethode verwenden, daher werde ich überlegen, welcher dieser beiden Prozesse schneller ist.
Ich habe den folgenden Vorgang auf einem Jupyter-Notebook versucht.
arr1 = np.zeros((30, 720, 1280))
# numpy.Verwenden Sie die Rollmethode
%timeit np.roll(arr1, 1, axis = 0)
# 147 ms ± 1.73 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
#Ersetzen Sie durch Verschiebung nach Index
%timeit arr1[1:,:,:] = arr1[0:-1,:,:]
# 189 ms ± 7.14 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
arr2 = np.zeros((720, 1280, 30))
# numpy.Verwenden Sie die Rollmethode
%timeit np.roll(arr2, 1, axis = 2)
# 186 ms ± 2.71 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
#Ersetzen Sie durch Verschiebung nach Index
%timeit arr2[:,:, 1:] = arr2[:,:,0:-1]
# 203 ms ± 1.06 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Es scheint, dass die Verwendung von numpy.roll unter der Bedingung, dass die Bildgröße groß ist, schneller ist. Außerdem scheint es schneller zu sein, Bilder beim ersten Index zu wechseln.
Wenn das Bild sehr klein ist (20 x 20 Pixel), ist die Indexverschiebung schneller, wie unten gezeigt.
arr3 = np.zeros((30, 20, 20))
# numpy.Verwenden Sie die Rollmethode
%timeit np.roll(arr3, 1, axis = 0)
# 17.1 µs ± 551 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
#Ersetzen Sie durch Verschiebung nach Index
%timeit arr3[1:,:,:] = arr3[0:-1,:,:]
# 7.36 µs ± 90.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
#Fehler
arr[0:-2,:,:] = arr[1:-1,:,:]
arr[-1,:,:] = new_image
#Richtige Antwort
arr[0:-1,:,:] = arr[1:,:,:]
arr[-1,:,:] = new_image
Wenn Sie den ersten Index auf -1 setzen, wird der letzte Index angegeben.
arr[1:-1,:,:]Dann
Auf den ersten Blick scheint es, dass Sie vom zweiten bis zum ersten (bis zum letzten Index) angeben können.
Da das vorletzte angegeben ist, besteht die Bewegung darin, dass sich das letzte Bild nicht nach vorne verschiebt.
Recommended Posts