#python #2d #overlapping #binning
#python #2d #перекрытие #привязка
Вопрос:
У меня есть данные в виде XYZ. Например:
x = numpy.arange(100)
y = numpy.arange(100)
Z = numpy.random.random_sample((100,))
Я хотел бы привязать данные, например, с перекрытием длин dx = 2
и dy = 2
. Что я сделал, так это:
nx = len(x)
ny = len(y)
bin_data = np.zeros((nx, ny))
For i in range(nx):
For j in range(ny):
For a, b, c in zip(x,y,z):
if (x[i] < a) and (a < x[i] dx):
if (y[j] < b) and (b < y[j] dy):
bin_data[i,j] = c
Для этих небольших данных программа работает хорошо. Однако это занимает у меня слишком много времени, если данные большие. Не могли бы вы порекомендовать какой-либо более быстрый алгоритм для привязки данных с перекрытием в python. Я знаю numpy.histogram2d
, что это довольно быстро, но это не работает для биннинга с перекрытием.
Ответ №1:
Я думаю, что вы могли бы легко ускорить свой алгоритм, переместив zip за пределы 2 других циклов, так как ИМХО это самая длинная операция :
for a, b, c in zip(x,y,z):
for i in range(nx):
for j in range(ny):
...
Затем, в вашем примере, вы могли бы использовать x[i] == i и y[j] == j (я добавляю 1
, потому что у вас строгий <
) :
for a, b, c in zip(x,y,z):
for i in range(a - dx 1, a):
for j in range(b - dy 1, b):
bin_data[i,j] = c
Фактически, вы можете выполнить эту вторую оптимизацию, как только x = f (i) и y = g (i), при этом f и g монотонны и легко обратимы, давая i = f-1 (x) и j = g-1 (y)