ПИТОН: Какой самый быстрый способ проверки и редактирования элемента в структурированном массиве, если он существует?
У меня есть некоторые проблемы с очень большими наборами данных. Мне нужно найти надежный и быстрый способ найти / заменить записи в моем структурированном массиве. Я ищу решение без зацикливания всех записей. Я знаю, что есть быстрые решения для C, но я не знаю, как подойти к этому в python. Мне также интересно, есть ли функция numpy для этой цели!
Я использую Python 2.7.13 и numpy 1.12.1!
ЗАДАЧА: Установите все позиции сирот в позиции data_centrals
найдя галоид сироты из data_orphan
в списке центральных в data_centrals
,
import numpy as np
data = Structured array:
class: ndarray
shape: (189258912,)
dt = [('hostid', '<u8'), ('z_pos', '<f8'), ('x_pos', '<f8'),
('y_pos', '<f8'), ('haloid', '<u8'), ('orphan', 'i1')]
РЕДАКТИРОВАНИЕ: Подвыборки данных с 200 объектами можно скачать здесь! Его структура задается с помощью dt: первый столбец -> hostid, второй -> z_pos и т. Д. Его можно скопировать / вставить как в оболочку или скрипт python...
Ниже вы можете найти код для установки позиций.
ВОПРОС: Есть ли умный способ поиска галоидов и установки позиций без зацикливания всех записей data_orphan
?
data_centrals=data[np.where(data['haloid']==data['hostid'])] # (111958237,)
data_orphans=data[np.where(data['orphan']==2)] # (61870681,)
a=0
while a<len(data_orphans):
#check where in data_centrals the haloid of the orphan can be found
position=np.where(data_centrals['haloid']==data_orphans['haloid'][a])
#find the position of data_orphan['haloid'][a] in data
position_data=np.where(data['hostid']==data_orphans['hostid'][a])
#set the positions
data['x_pos'][int(position_data[0])]=data_centrals['x_pos'][int(position[0])]
data['y_pos'][int(position_data[0])]=data_centrals['y_pos'][int(position[0])]
data['z_pos'][int(position_data[0])]=data_centrals['z_pos'][int(position[0])]
a+=1
1 ответ
Если ваша структура данных представляет собой простой, неупорядоченный список или массив, то ответ - нет. Для поиска определенного элемента потребуется линейное время O(n). Если список / массив упорядочен, вы можете выполнить бинарный поиск за O (LG N) времени. Вы также можете рассмотреть альтернативные структуры данных, такие как сбалансированный BST или словарь Python с лучшим временем поиска, но это зависит от структуры ваших данных, если такой подход уместен.