一维数组到二维数组映射

问题描述 投票:0回答:4

这听起来像是一个家庭作业问题,但我发誓不是。

我正在尝试为这个二维数组包装类构建一个迭代器。我想如果我能够解决这个问题,那么我就可以构建我的迭代器。

我有一个由 9 个连续整数组成的一维数组,从 0 开始到 8 结束。

[0, 1, 2, 3, 4, 5, 6, 7, 8]

我有两个变量

horizontal_size = 3
vertical_size = 3

我想把这个数组变成一个二维数组,即

horizontal_size
vertical_size
。为了简洁起见,我们称它们为
h
v

我想要生成的结果是这样的:

0 1 2
3 4 5
6 7 8

给定 1D 数组中的值(它告诉我索引),还给出

h
v
,在本例中均为 3。有没有办法在二维数组上生成索引?

例如,一维数组中的第一个元素是 0,它映射到

array[0][0]
。第二个元素是 1,映射到
array[0][1]

我发现我可以通过执行

array1d[i] mod vertical_size
来获得垂直索引。

           for getting the vertical index ::: th 

0 = [0][0] 0 模 3 = 0 1 = [0][1] 1 模 3 = 1 2 = [0][2] 2 模 3 = 2

3 = [1][0] 等等... 4 = [1][1] 5 = [1][2]

6 = [2][0] 7 = [2][1] 8 = [2][2]

但是我不知道如何获得水平索引。

arrays algorithm
4个回答
8
投票

水平索引由

floor(i / v)
给出,或者如果您的编程语言通过截断实现整数除法,则为
i/v

例如,floor(7/3) = 2,因此 7 位于第 2 行。


6
投票

这是java中的工作解决方案。请注意,

%
mod
函数。

public static void main(String[] args) throws IOException {
    int[] oneD = {1,2,3,4,5,6};
    int w = 3;
    int h = 2;
    int[][] twoD = new int[h][w];
    int[] oneDReversed = new int[oneD.length];

    for (int i = 0; i < h; i++) {
        for (int j = 0; j < w; j++) {
            twoD[i][j] = oneD[i*w+j];
        }
    }

    for (int i = 0; i < w*h; i++) {
        oneDReversed[i] = twoD[(i / w)][(i%w)];
    }
}

为什么

twoD[i][j] = oneD[i*w+j]
?因为你有一个循环,“对于每一行
i
,选择所有列
j
,并通过等式将其提供给
array[num_of_rows][num_of_columns]
row*width
+
column

保留的意思是:

row
向下取整
index
除以
number_of_columns
column
是除以相同变量 (mod) 的剩余部分。


0
投票

这是我在 C# 中所做的,我想说这是在 1D 和 2D 数组之间进行转换的最简单、最高效的方法,它不需要在循环中执行任何数学运算,如果您有包含数百万个项目的数组,这可能很重要 (比如阅读和书写图像)

C#代码:

// Creates a 2D array from a 1D array
public static int[,] Array1Dto2D(int[] array1D, int width, int height)
{
    int[,] array2D = new int[width, height];
    int i = 0;
    for (int y = 0; y < height; y++)
    {
        for (int x = 0; x < width; x++)
        {
            array2D[x, y] = array1D[i];
            i++;
        }
    }
    return array2D;
}

// Creates a 1D array from a 2D array
public static int[] Array2Dto1D(int[,] array2D)
{
    int width = array2D.GetLength(0);
    int height = array2D.GetLength(1);
    int[] array1D = new int[width * height];
    int i = 0;
    for (int y = 0; y < height; y++)
    {
        for (int x = 0; x < width; x++)
        {
            array1D[i] = array2D[x, y];
            i++;
        }
    }
    return array1D;
}

0
投票

在Python中,您可以使用numpy函数unravel_index,它具有参数、索引和形状,例如:

np.unravel_index(4,(3,4))
© www.soinside.com 2019 - 2024. All rights reserved.