【问题标题】:Numpy Like Arrays for CC 的 Numpy 类似数组
【发布时间】:2018-04-18 05:38:12
【问题描述】:

在 numpy 中,您可以使用 array.sizearray.shape 访问数组的大小和形状,而可以使用 array[i] 访问元素。

如何使用 C 结构实现这一目标?可以做类似的事情

struct{
    int size;
    int shape[2];
    int *elements;
} int_array;

但是元素可以被访问为

int_array.elements[i].

不像 numpy。

我怎样才能有一个存储大小和形状的数组,但可以使用 [] 以通常的方式访问其元素?

【问题讨论】:

  • 问题是什么?
  • 应该可以使用适当的(本地)VLA typedef(以及该类型的类型转换或辅助变量)。
  • 如果 C++ 是一个选项,check out xtensor

标签: c numpy


【解决方案1】:
  1. 分配一个比您需要的大 3 个单元格的数组。
  2. 将大小和形状放在前 3 个单元格中
  3. 将指针增加3 * sizeof(int)
  4. 为大小和形状编写访问器。

然后您可以以通常的方式访问该数组。

在释放指针之前不要忘记从指针中减去 3 * sizeof(int)

【讨论】:

  • 这仅适用于元素类型大到足以容纳维度的数组...
【解决方案2】:

您可以使用简单的宏将指针转换为二维数组 (source):

#define INDEX(a) ((int(*)[a.shape[1]]) a.elements)

你可以用作什么

#include <stdio.h>
#include <stdlib.h>

typedef struct{
    int size;
    int shape[2];
    int *elements;
} int_array;


int main() {
    int_array arr;
    arr.shape[0] = 2;
    arr.shape[1] = 3;
    arr.elements = malloc(6*sizeof(*arr.elements));

    INDEX(arr)[0][1] = 2;

    printf("%d", INDEX(arr)[0][1]);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多