如何按希尔伯特曲线的顺序将2d矩阵(n x n)展平为1d数组?

时间:2019-04-02 11:26:59

标签: python hilbert-curve

我想将python中的2d(n x n)矩阵展平为1d数组,但是我希望它遵循希尔伯特曲线的顺序,而不是行主要顺序?

例如,如果我的输入数据是2x2->

    data[[a b] [c d]] 

我希望输出为1x4->

    [c, a, b, d]

但是我想使用尺寸为256 x 256的图像来做到这一点

另一个例子是数据

    [[12 15  5  0]
     [ 3 11  3  7]
     [ 9  3  5  2]
     [ 4  7  6  8]]

我希望输出为

    [ 4  7  3  9  3 12 15 11  3  5  0  7  2  5  6  8]

在python中执行此操作的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

我建议您使用hilbertcurve库。

pip install hilbertcurve
or
conda install hilbertcurve 

首先,矩阵大小必须为2 ^ n。如果要转换4x4矩阵(大小= 16),则需要指定维数(N)和构造希尔伯特曲线(p)所用的迭代次数

from hilbertcurve.hilbertcurve import HilbertCurve
import numpy as np

X = np.array(
    [[12, 15,  5,  0],
     [ 3, 11,  3,  7],
     [ 9,  3,  5,  2],
     [ 4,  7,  6,  8]])

p = 3
N = 2
hilbert_curve = HilbertCurve(p, N)

# compute indexes for 2D -> 1D transform
indexes = np.zeros((4*4,N), dtype='int')
for i in range(4*4):
    coords = hilbert_curve.coordinates_from_distance(i)
    indexes[i,:] = coords

# transform 
vector = [X[x,y] for x,y in indexes]

您得到的结果

[12, 3, 11, 15, 5, 0, 7, 3, 5, 2, 8, 6, 7, 3, 9, 4]

您的曲线如下所示:
Hilbert cureve
您可以使用p值来获得不同的曲线,但是我想您已经明白了。