Эффективно отделить часть массива на основе диапазона другого, когда массивы очень большие

1

У меня два набора массивов numpy: x1, y1 и x2, y2. Я хочу сохранить все значения x1 и y1, соответствующие координатам y в массиве y2. Мы можем предположить, что все значения y2 присутствуют в массиве y1.

например

x1 = [5,6,7,8,9,0] 
y1 = [1,2,3,4,5,6]
x2 = [5,4,3,2] 
y2 = [2,3,4,5]

#as y2 values 2,3,4,5 are present in y1, I want the output to be:
x1 = [6,7,8,9] y1 = [2,3,4,5]

Поэтому все выходные массивы имеют одинаковый размер и имеют одинаковые координаты y.

Я могу сделать это, используя следующий код. Тем не менее, массивы, с которыми я хочу работать, имеют размеры> 100 тыс., Что делает это очень медленным и неэффективным. Есть лучший способ сделать это? Скорость и эффективность - моя главная цель, если я узнаю лучший метод, а затем его бонус! Заранее спасибо!!

x1 = [5,6,7,8,9,0]
y1 = [1,2,3,4,5,6]

x2 = [11,12,13,14]
y2 = [2,3,4,5]

max1 = max(y2)
min1 = min(y2)

for i, y in enumerate(y1):
    if (y >= min1) and (y <= max1):
        print (x1[i],y)
  • 0
    когда вы говорите о «сопоставлении» координат y, ваш код просто проверяет, является ли min(y2) <= y1 <= max(y2) и вы вряд ли добьетесь большего успеха, чем код, который у вас уже есть для фактического сопоставления. эффективность, которая будет достигнута, вероятно, в другом месте. т.е. получать данные лучше
  • 0
    Что вы подразумеваете под соответствием? Ожидаемый результат y1 может быть достигнут просто с помощью print(set(y2).intersection(set(y1))) . Не могу понять вывод x1
Показать ещё 1 комментарий
Теги:
arrays
performance
bigdata

2 ответа

1
Лучший ответ

Используйте numpy для производительности. Найти соответствующие индексы за один проход, где два списка одинаковы, и нарезать массив numpy с использованием соответствующих индексов

import numpy as np
x1 = [5,6,7,8,9,0] 
y1 = [1,2,3,4,5,6]
y2=[2,3,4,5]
x2_indices=[i for i, item in enumerate(y1) if item in y2] #[1, 2, 3, 4]
x2=np.array(x1)[x2_indices]
print(x2,y2) #(array([6, 7, 8, 9]), [2, 3, 4, 5])

Если вы ищете один вкладыш и должны быть быстрее предыдущего (еще не проверены)

import numpy as np
print(np.array(x1)[np.nonzero(np.in1d(y1, y2))[0]]) #[6, 7, 8, 9])
  • 0
    Один лайнер работает на меня, спасибо! Я буду делать больше скоростного тестирования с этим, но кажется, что np.isin () рекомендуется по сравнению с np.in1d (). Спасибо!
1

Попробуй это

import numpy as np

x1 = np.array([5,6,7,8,9,0])
y1 = np.array([1,2,3,4,5,6])
x2 = np.array([5,4,3,2])
y2 = np.array([2,3,4,5])

elements = np.array([item for item in y2 if item in y1])
idxs = [np.where(y1 == item)[0][0] for item in elements]

print(x1[idxs], elements)

Выход:

[6 7 8 9] [2 3 4 5]
  • 1
    Спасибо! Ваш ответ высоко ценится, хорошо работает для массивов, которые у меня есть.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню