这听起来像是一个家庭作业问题,但我发誓不是。
我正在尝试为这个二维数组包装类构建一个迭代器。我想如果我能够解决这个问题,那么我就可以构建我的迭代器。
我有一个由 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]
但是我不知道如何获得水平索引。
水平索引由
floor(i / v)
给出,或者如果您的编程语言通过截断实现整数除法,则为 i/v
。
例如,floor(7/3) = 2,因此 7 位于第 2 行。
这是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) 的剩余部分。
这是我在 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;
}
在Python中,您可以使用numpy函数unravel_index,它具有参数、索引和形状,例如:
np.unravel_index(4,(3,4))