У меня есть два больших массива типа numpy.core.memmap.memmap, называемых data и new_data, с> 7 миллионами элементов float32.
Мне нужно перебрать их обоих в одном и том же цикле, который я сейчас делаю так.
for i in range(0,len(data)):
if new_data[i] == 0: continue
combo = ( data[i], new_data[i] )
if not combo in new_values_map: new_values_map[combo] = available_values.pop()
data[i] = new_values_map[combo]
Однако это неоправданно медленно, поэтому я понимаю, что использование функций векторизации numpy - это путь.
Можно ли векторизовать с помощью индекса, чтобы векторизованный массив мог сравнивать свои элементы с соответствующим элементом в другом массиве?
Я думал о том, чтобы заархивировать два массива, но я думаю, что это приведет к необоснованным накладным расходам на подготовку?
Есть ли другой способ оптимизировать эту операцию?
Для контекста: цель состоит в том, чтобы эффективно объединить два массива так, чтобы каждая уникальная комбинация соответствующих значений между двумя массивами была представлена другим значением в результирующем массиве, за исключением нулей в массиве new_data, которые игнорируются. Массивы представляют трехмерные растровые изображения.
РЕДАКТИРОВАТЬ: available_values — это набор значений, которые еще не использовались в data и сохраняются при вызовах этого цикла. new_values_map, с другой стороны, сбрасывается в пустой словарь перед каждым использованием этого цикла.
EDIT2: массив данных содержит только целые числа, то есть: он инициализируется нулями, а затем при каждом использовании этого цикла с другим new_data он заполняется дополнительными значениями, взятыми из available_values, который изначально представляет собой диапазон целых чисел. new_data теоретически может быть чем угодно.
xrangeвместоrange. - person Daniel Thaagaard Andreasen   schedule 11.03.2013available_valuesкdataявляется вашей основной проблемой векторизации. Как вы написали, вы, кажется, последовательно проходите каждое значение, выталкивая одно за раз и назначая его данным. Если это то, что вы делаете, вы можете сделать что-то вроде моего ответа. Если вы делаете что-то более сложное, нам нужно знать об этом, чтобы предложить любую разумную помощь. - person Henry Gomersall   schedule 11.03.2013available_valuesв крошечной части времени? Для 99% итераций комбинация уже будет в словареnew_values_map, поэтомуavailable_valuesне вызывается. - person Nat   schedule 11.03.2013combo; может ли он поместиться в 2D-массиве? - person Henry Gomersall   schedule 11.03.2013dataиnew_dataприводит к согласованному целочисленному значению по этому индексуdata? (в идеале отбирать значения по порядку из пулаavailable_values, который поддерживается глобально) - person Nat   schedule 11.03.2013