Ho una matrice numpy di dimensioni (4, X, Y), in cui la prima dimensione rappresenta un quadruplo (R, G, B, A). Il mio obiettivo è quello di trasporre ogni quadruplet X*Y
RGBA a valori a virgola mobile X*Y
, dato un dizionario che li abbina.Miglioramento delle prestazioni dell'operazione di mappatura numpy
mio codice attuale è la seguente:
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)
Dove data
è una matrice di dimensione NumPy (4, rows, cols)
, e new_data
è di dimensioni (rows, cols)
.
Il codice funziona correttamente, ma richiede molto tempo. Come dovrei ottimizzare quel pezzo di codice?
Ecco un esempio completo:
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)
Come ci sono molte 'righe' e' cols'? – Will
@Will Molte migliaia per ciascuno. –
Forse questo aiuterà: http://stackoverflow.com/questions/36480358/whats-a-fast-non-loop-way-to-apply-a-dict-to-a-array-mating-use-elements – hpaulj