4

我想将 python 中的 2d (nxn) 矩阵展平为 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 中执行此操作的最佳方法是什么?

4

2 回答 2

1

我建议你使用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]

你的曲线看起来像这样:
希尔伯特曲线
你可以玩 p 值来获得不同的曲线,但我认为你明白了。

于 2020-05-27T08:07:15.767 回答
0

您可以使用该软件包numpy-hilbert-curve。例如:

import numpy as np
from hilbert import decode


def hilbert_flatten(array):
    D = array.ndim
    S = np.arange(np.array(array.shape).prod())
    L = decode(S, D, 8).T.tolist()

    return array[tuple(L)]


if __name__ == '__main__':
    a = np.array([[12, 15, 5, 0],
                  [3, 11, 3, 7],
                  [9, 3, 5, 2],
                  [4, 7, 6, 8]])

    print(hilbert_flatten(a))

将有输出: [12 3 11 15 5 0 7 3 5 2 8 6 7 3 9 4]

这可能不是最快的方法(但我发现的最快和最简单的方法),优点是它也适用于(几乎)任何大小的 n 维 numpy 数组。

于 2022-01-25T21:45:09.990 回答