ПИТОН: Какой самый быстрый способ проверки и редактирования элемента в структурированном массиве, если он существует?

У меня есть некоторые проблемы с очень большими наборами данных. Мне нужно найти надежный и быстрый способ найти / заменить записи в моем структурированном массиве. Я ищу решение без зацикливания всех записей. Я знаю, что есть быстрые решения для 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 с лучшим временем поиска, но это зависит от структуры ваших данных, если такой подход уместен.

Другие вопросы по тегам