Эта операция должна применяться как можно быстрее, как фактические массивы, содержащие миллионы элементов. Это простая версия проблемы.лучше, чем функция numpy in1d mask: упорядоченные массивы?
Итак, у меня есть случайный массив из уникальных целых чисел (обычно миллионы элементов).
totalIDs = [5,4,3,1,2,9,7,6,8 ...]
У меня есть еще один массив (обычно десятки тысяч) уникальных целых чисел который я могу создать маску.
subsampleIDs1 = [5,1,9]
subsampleIDs2 = [3,7,8]
subsampleIDs3 = [2,6,9]
...
я могу использовать NumPy сделать
маска = np.in1d (totalIDs, subsampleIDs, assume_unique = True)
можно затем извлечь информацию, которую я хочу другого массива используя маску (например, столбец 0 содержит тот, который я хочу).
переменная = allvariables [маска] [:, 0]
Теперь, учитывая, что идентификаторы являются уникальными в обоих массивах, есть ли способ, чтобы значительно ускорить этот процесс. Требуется много времени, чтобы создать маску для нескольких тысяч точек (subsampleID), соответствующих миллионам идентификаторов (totalID).
Я думал о том, чтобы пройти через него один раз и написать двоичный файл индекса (для ускорения будущих поисков).
for i in range(0,3):
mask = np.in1d(totalIDs,subsampleIDs,assume_unique=True)
index[mask] = i
где X находится в subsampleIDsX. Тогда я могу просто сделать:
for i in range(0,3):
if index[i] == i:
rowmatch = i
break
variable = allvariables[rowmatch:len(subsampleIDs),0]
правый? Но это также медленно, потому что в цикле есть условие, чтобы найти, когда оно сначала совпадает. Есть ли более быстрый способ найти, когда число сначала появляется в упорядоченном массиве, поэтому условие не замедляет цикл?
Не могли бы вы объяснить «диапазон (0,3)», и что вы подразумеваете под «где X находится в subsampleIDsX»? Ответ на последний вопрос - «двоичный поиск», но я не могу окунуться в голову, как он относится к приведенному выше коду. –
диапазон (0,3) просто означает перебрать количество файлов. то есть file1, file2, file3, file4 и т. д. X представляет наибольший номер файла. – Griff