İlk boyutun bir (R, G, B, A) dörtgösterim anlamına geldiği, sayısal bir sayı dizisi (4, X, Y) var. Amacım, her bir X*Y
RGBA dörtlüsünü X*Y
kayan nokta değerlerine aktarmak ve bunları eşleştiren bir sözlük vermektir. aşağıdaki gibiEşdüzenli eşleme işleminin performansını artırma
My geçerli kod:
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)
data
boyutu
(4, rows, cols)
bir numpy dizi olan
ve new_data
boyutu (rows, cols)
taşımaktadır.
Kod çalışıyor, ancak oldukça uzun bir zaman alıyor. Bu kod parçasını nasıl optimize etmeliyim? İşte beklenen sonucu döndüren bir yaklaşımdır
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)
nasıl verimli ve kısaca sorunu çözmek için kullanılabilecek list.index bir vektörleşen nd-dizi yetenekli varyant içerir çok sayıda 'satır' ve 'cols' var mı? – Will
@Will Her biri için binlerce var. –
Belki bu yardımcı olacaktır: http://stackoverflow.com/questions/36480358/whats-a-fast-non-loop-way-to-apply-a-dict-to-a-ndarray-meaning-use-elements – hpaulj