Python: сделать список уникальным и заменить дубликаты - PullRequest
0 голосов
/ 30 октября 2018

Я хочу найти уникальный список с порядком сохранения в виде списка целых чисел, где дубликаты заменяются нулями. Это все в контексте, чтобы найти ближайшие точки из набора многомерных точек в другой.

* ** 1003 тысяча два * Пример
import scipy
import numpy as np
a = np.random.rand(100,4)
b = np.random.rand(200,4)
tree=scipy.spatial.cKDTree(a)
indexesOf_neighbors= tree.query(b, 1)[1]
_, idx = np.unique(indexesOf_neighbors, return_index=True)
print(indexesOf_neighbors)
print(indexesOf_neighbors[np.sort(idx)])

Таким образом, первые появления числа должны быть сохранены. Все следующие дубликаты следует заменить на np.infs, например:

[38 66 79 10 35 83 99 89 68 65 20 np.inf 46 np.inf 24 51 13 0 17 87 90 54 45 63 69 56 np.inf 32 62 49 99 67 82 np.inf 64 np.inf np.inf np.inf ...]

Другой вариант - найти все индексы дубликатов (но не их первое появление)

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Как насчет создания массива с помощью np.inf, а затем замены уникальных позиций?

from scipy import spatial
import numpy as np

a = np.random.rand(100,4)
b = np.random.rand(200,4)
tree=spatial.cKDTree(a)
indexesOf_neighbors= tree.query(b, 1)[1]
u, idx = np.unique(indexesOf_neighbors, return_index=True)
print(indexesOf_neighbors)

u_indexesOf_neighbors = np.empty(indexesOf_neighbors.shape, dtype=np.float64)
u_indexesOf_neighbors.fill(np.inf)
u_indexesOf_neighbors[idx] = u
print(u_indexesOf_neighbors)

результат

[82 61  4  5 32 48 62 80 50 96 84 49 37 58 17 80 52  1 33 76 50 24 22 31
  3 77 71  3 30 43 89 67 74 18 39 72 96 16 29 29 11 59 83 12 55  3 34 87
 74 93 21 96 83 89 21 61  3 81 39 93  8 80 64 47 83 27 46 34 72 64 34 42
 72 82 74 70  0 23 56 14 69 88  2 87 26 56 89 53  3 33 94 43 43  8 86  2
 76 10 95 71 99 76 82 87 92 97 92 25 61 48 94 15 55 86 35 87 83 66 39 79
 77 57 62  1 43 74 27 34 16 83 29 34 31  2 90 51  1  2 33 17 30 96  2 82
 22 44  0 88  7 33 36 55 95 94 64 54 86 36 34 24 48  1  7 68 77 30 70 24
 28 73 43 16 20 56 55 94 63 71  5 38 86 46 23 66 48  1 72  7  8 88 56  1
 80 85 84  7 97  2 55 35]
[82. 61.  4.  5. 32. 48. 62. 80. 50. 96. 84. 49. 37. 58. 17. inf 52.  1.
 33. 76. inf 24. 22. 31.  3. 77. 71. inf 30. 43. 89. 67. 74. 18. 39. 72.
 inf 16. 29. inf 11. 59. 83. 12. 55. inf 34. 87. inf 93. 21. inf inf inf
 inf inf inf 81. inf inf  8. inf 64. 47. inf 27. 46. inf inf inf inf 42.
 inf inf inf 70.  0. 23. 56. 14. 69. 88.  2. inf 26. inf inf 53. inf inf
 94. inf inf inf 86. inf inf 10. 95. inf 99. inf inf inf 92. 97. inf 25.
 inf inf inf 15. inf inf 35. inf inf 66. inf 79. inf 57. inf inf inf inf
 inf inf inf inf inf inf inf inf 90. 51. inf inf inf inf inf inf inf inf
 inf 44. inf inf  7. inf 36. inf inf inf inf 54. inf inf inf inf inf inf
 inf 68. inf inf inf inf 28. 73. inf inf 20. inf inf inf 63. inf inf 38.
 inf inf inf inf inf inf inf inf inf inf inf inf inf 85. inf inf inf inf
 inf inf]

Я выбрал float64 dtype. Но вы можете выбрать любой.

0 голосов
/ 30 октября 2018

создайте независимую копию списка на тот случай, если впоследствии вам понадобится оригинал:

unique_list = indexesOf_neighbors.copy()
####keep track of unique items
unique_set = []

for idx, i in enumerate(unique_list):
    if i not in unique_set:
        unique_set.append(i) #add first non-repeating element to set
    else:
        unique_list[idx] = 0 #replace duplicates with zero
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...