У меня есть массив с координатами N точек. Другой массив содержит массы этих N точек.Найти индексы уникальных значений 3-мерной матрицы numpy
>>> import numpy as np
>>> N=10
>>> xyz=np.random.randint(0,2,(N,3))
>>> mass=np.random.rand(len(xyz))
>>> xyz
array([[1, 0, 1],
[1, 1, 0],
[0, 1, 1],
[0, 0, 0],
[0, 1, 0],
[1, 1, 0],
[1, 0, 1],
[0, 0, 1],
[1, 0, 1],
[0, 0, 1]])
>>> mass
array([ 0.38668401, 0.44385111, 0.47756182, 0.74896529, 0.20424403,
0.21828435, 0.98937523, 0.08736635, 0.24790248, 0.67759276])
Теперь я хочу, чтобы получить массив с уникальными значениями А и соответствующего массива подытожить массы. Это означает, что следующие массивы:
>>> xyz_unique
array([[0, 1, 1],
[1, 1, 0],
[0, 0, 1],
[1, 0, 1],
[0, 0, 0],
[0, 1, 0]])
>>> mass_unique
array([ 0.47756182, 0.66213546, 0.76495911, 1.62396172, 0.74896529,
0.20424403])
Моя попытка была следующий код с двойной для цикла:
>>> xyz_unique=np.array(list(set(tuple(p) for p in xyz)))
>>> mass_unique=np.zeros(len(xyz_unique))
>>> for j in np.arange(len(xyz_unique)):
... indices=np.array([],dtype=np.int64)
... for i in np.arange(len(xyz)):
... if np.all(xyz[i]==xyz_unique[j]):
... indices=np.append(indices,i)
... mass_unique[j]=np.sum(mass[indices])
Проблема заключается в том, что это занимает слишком много времени, я на самом деле есть N = 100000. Есть ли более быстрый способ или как я могу улучшить свой код?
EDIT Мои координаты на самом деле являются номерами с плавающей точкой. Для простоты, я сделал случайные числа, чтобы иметь дубликаты при низком N.
Связанный: [Поиск уникальных строк в numpy.array] (http://stackoverflow.com/questions/16970982/find-unique-rows-in-numpy-array) –
это выглядит интересно .. принятый ответ создает индексы уникальных значений очень быстро, но я теряю информацию о повторяющихся значениях. Таким образом, становится трудно восстановить, какие значения массы суммируются впоследствии. Или какой ответ следует уделить внимание? – Andy