如何按希尔伯特曲线的顺序将二维矩阵(n x n)展平为一维数组?
Posted
技术标签:
【中文标题】如何按希尔伯特曲线的顺序将二维矩阵(n x n)展平为一维数组?【英文标题】:How to flatten 2d matrix (n x n) into 1d array in order of Hilbert Curve? 【发布时间】:2019-08-23 17:08:09 【问题描述】:我想将 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 中最好的方法是什么?
【问题讨论】:
你检查过这个库吗? github.com/galtay/hilbertcurve 【参考方案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]
你的曲线看起来像这样:Hilbert cureve 您可以使用 p 值来获得不同的曲线,但我认为您明白了。
【讨论】:
【参考方案2】:您可以使用包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 数组。
【讨论】:
以上是关于如何按希尔伯特曲线的顺序将二维矩阵(n x n)展平为一维数组?的主要内容,如果未能解决你的问题,请参考以下文章