Привязка 2D-данных с перекрытием в python

#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)