У меня есть массив 3D numpy, arr
, с формой m*n*k
.Создать уникальные значения на основе строк в массиве numpy
для каждого набора значений вдоль оси m
(например, arr[:, 0, 0]
) Я хочу, чтобы генерировать одно значение для представления этого набора, так что я может в конечном итоге с матрицей 2D, n*k
. Если повторяется набор значений вдоль оси m
, мы должны генерировать одно и то же значение каждый раз.
I.e Это проблема хэширования.
Я создал решение проблемы с использованием словаря, но это резко снижает производительность. Для каждого набора значений, я вызвать эту функцию:
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
Сам массив, как правило, от размера 30 * 256 * 256, так что один набор значений будет иметь 30 значений. У меня есть сотни таких массивов для обработки в любой момент времени. В настоящее время выполнение всей обработки, которая должна быть выполнена до вычисления хэша , занимает 1,3 секунды для блока из 100 массивов. Включая хеширование, которое до 75 секунд.
Есть ли более быстрый способ генерации единственного репрезентативного значения?
ли представительное значение должны хорошо выглядеть? ... или это может быть «что угодно»? – plonser
@plonser: Любое целое число – jramm
Все ли массивы одинаковой формы '30 x 256 x 256'? – Divakar