Mam numpy tablicy rozmiar (4, X, Y), gdzie pierwszy wymiar oznacza (R, G, B, A) czworak. Moim celem jest przetransponowanie każdego kwadratu RGBA o wartości X*Y
na wartości zmiennoprzecinkowe X*Y
, z uwzględnieniem odpowiadającego im słownika.Poprawianie wydajności operacji numpy mapowania
Mój bieżący kod wygląda następująco:
codeTable = {
(255, 255, 255, 127): 5.5,
(128, 128, 128, 255): 6.5,
(0 , 0 , 0 , 0 ): 7.5,
}
for i in range(0, rows):
for j in range(0, cols):
new_data[i,j] = codeTable.get(tuple(data[:,i,j]), -9999)
Gdzie data
jest do tablicy numpy wielkości (4, rows, cols)
i new_data
jest od wielkości (rows, cols)
.
Kod działa poprawnie, ale zajmuje dość dużo czasu. Jak zoptymalizować ten fragment kodu?
Oto pełny przykład:
import numpy
codeTable = {
(253, 254, 255, 127): 5.5,
(128, 129, 130, 255): 6.5,
(0 , 0 , 0 , 0 ): 7.5,
}
# test data
rows = 2
cols = 2
data = numpy.array([
[[253, 0], [128, 0], [128, 0]],
[[254, 0], [129, 144], [129, 0]],
[[255, 0], [130, 243], [130, 5]],
[[127, 0], [255, 120], [255, 5]],
])
new_data = numpy.zeros((rows,cols), numpy.float32)
for i in range(0, rows):
for j in range(0, cols):
new_data[i,j] = codeTable.get(tuple(data[:,i,j]), -9999)
# expected result for `new_data`:
# array([[ 5.50000000e+00, 7.50000000e+00],
# [ 6.50000000e+00, -9.99900000e+03],
# [ 6.50000000e+00, -9.99900000e+03], dtype=float32)
Jak jest wiele 'wierszy' i' cols'? – Will
@Will Wiele tysięcy dla każdego. –
Może to pomoże: http://stackoverflow.com/questions/36480358/whats-a-fast-non-loop-way-to-apply-a-dict-to-a-ndarray-meaning-use-elements – hpaulj