0

我有 XYZ 类型的数据。例如:

x = numpy.arange(100)
y = numpy.arange(100)
Z = numpy.random.random_sample((100,))

我想对数据进行分箱,例如,重叠长度为dx = 2dy = 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速度很快,但它不适用于重叠分箱。

4

1 回答 1

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是因为您有 strict <):

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)

于 2014-06-27T07:47:48.133 回答