Есть ли более быстрая альтернатива np.where ()? - PullRequest
1 голос
/ 18 июня 2020

У меня есть набор из 100 файлов данных, содержащих информацию о частицах (ID, скорость, положение и т. Д. c). Мне нужно выделить 10000 конкретных c частиц, имеющих определенные идентификационные номера из каждой из них. Я делаю это следующим образом:

for i in range(n_files+1):
    data= load_data_file(i, datatype="double_precision")
    for j in chosen_id_arr:
        my_index= np.where((particleID_in_data)==j)
        identity.append(ID[my_index])
        x.append(x_component[my_index])
        y.append(y_component[my_index])
        z.append(z_component[my_index])


Список «selected_id_array» содержит все такие идентификаторы. Файлы данных структурированы по индексу списка.

Этот фрагмент по какой-то причине работает очень медленно, я искал более быструю и эффективную альтернативу для этого. Заранее большое спасибо. :)

1 Ответ

0 голосов
/ 21 июня 2020

Используя словарь, вы можете сохранить позиционную информацию, связанную с идентификатором частицы, используя масштабирование поиска O (1) для словарей:

# What the data in a single file would look like:
data = {1:[0.5,0.1,1.], 4:[0.4,-0.2,0.1], ...}
# A lookup becomes very simple syntactically:
for ID in chosen_id_arr:
    x, y, z = data[ID]
    # Here you can process the obtained x,y,z.

Это намного быстрее, чем поиск numpy . Что касается обработки данных о местоположении в l oop, вы могли бы подумать о том, чтобы иметь отдельные списки позиций для различных идентификаторов частиц, но я думаю, что это не входит в рамки вопроса. Здесь также может помочь пакет pandas.

...