J'ai un tableau numpy 3D, arr
, de forme m*n*k
.Générer des valeurs uniques basées sur des lignes dans un tableau numpy
pour chaque ensemble de valeurs le long de l'axe m
(par exemple arr[:, 0, 0]
) Je veux générer une valeur unique pour représenter cet ensemble, de sorte que je peux retrouver avec une matrice 2D, n*k
. Si un ensemble de valeurs le long de l'axe m
est répété, alors nous devrions générer la même valeur à chaque fois.
C'est un problème de hachage.
J'ai créé une solution au problème en utilisant un dictionnaire, mais cela réduit considérablement les performances. Pour chaque ensemble de valeurs, j'appeler cette fonction:
def getCellId(self, valueSet):
# Turn the set of values (a numpy vector) to a tuple so it can be hashed
key = tuple(valueSet)
# Try and simply return an existing ID for this key
try:
return self.attributeDict[key]
except KeyError:
# If the key was new (and didnt exist), try and generate a new Id by adding one to the max of all current Id's. This will fail the very first time we do this (as there will be no Id's yet), so in that case, just assign the value '1' to the newId
try:
newId = max(self.attributeDict.values()) +1
except ValueError:
newId = 1
self.attributeDict[key] = newId
return newId
Le tableau lui-même est généralement de la taille 30 * 256 * 256, donc un ensemble de valeurs aura 30 valeurs. J'ai des centaines de ces tableaux à traiter en même temps. Actuellement, tout le traitement qui doit être effectué pour calculer le hachage prend 1,3 s pour un bloc de 100 baies. Y compris les bosses de hachage jusqu'à 75s.
Existe-t-il un moyen plus rapide de générer la valeur représentative unique?
Est-ce que la valeur représentative ont l'air agréable? ... ou peut-il être "n'importe quoi"? – plonser
@plonser: Tout nombre entier – jramm
Tous les tableaux de la même forme '30 x 256 x 256' sont-ils? – Divakar