在C中将数组从1D重塑为ND

时间:2017-05-17 13:14:05

标签: c arrays list-manipulation

我在尝试自己实现这一点时遇到了很多麻烦,所以如果有人能够指出或描述算法,我就会非常感激。

问题陈述

给定一维扁平指针int* i看起来像这个{1,2,3,4},并给出列表{2,2}形式的维度列表重塑1D数组以符合指定的维度。整个过程后,数组应该看起来像{{1,2},{3,4}}

我基本上问是否有人知道numpy.reshape中使用的算法。

2 个答案:

答案 0 :(得分:3)

中的n维数组只不过是用于计算简单数组内偏移量的语法糖,它们在内存中看起来相同(一个连续的块)。因此,“重塑”它真的没有意义,正如这个小样本所示:

#include <stdio.h>

int data[] = {1,2,3,4};

int main(void)
{
    int *i = data;

    for (int n = 0; n < 4; ++n)
    {
        printf("i[%d] = %d\n", n, i[n]);
    }

    int (*j)[2] = (void *)i;

    for (int n1 = 0; n1 < 2; ++n1)
    {
        for (int n2 = 0; n2 < 2; ++n2)
        {
            printf("j[%d][%d] = %d\n", n1, n2, j[n1][n2]);
        }
    }

    return 0;
}

输出:

  

我[0] = 1
  我[1] = 2
  我[2] = 3
  我[3] = 4
  j [0] [0] = 1
  j [0] [1] = 2
  j [1] [0] = 3
  j [1] [1] = 4

答案 1 :(得分:0)

NumPy不需要算法,因为无论形状如何,它都会连续存储数据。 &#34;形状&#34; property是reshape()的输入和输出之间的唯一差异。稍后访问阵列时,算法会发挥作用,例如打印时。然后,您需要按照形状来了解每行或其他维度中有多少元素。