numpy内部存储数组的大小吗?

时间:2016-09-07 19:41:14

标签: python c numpy

来自here的numpy数组的规范:

typedef struct PyArrayObject {
    PyObject_HEAD
    char *data;
    int nd;
    npy_intp *dimensions;
    npy_intp *strides;
    PyObject *base;
    PyArray_Descr *descr;
    int flags;
    PyObject *weakreflist;
} PyArrayObject;

当我查看numpy数组的规范时,我没有看到它存储了数组的元素数量。那是真的吗?

不存储它有什么好处?

谢谢。

2 个答案:

答案 0 :(得分:5)

大小(即数组中元素的总数)计算为数组dimensions中值的乘积。该数组的长度为nd

在实现numpy核心的C代码中,您会发现宏PyArray_SIZE(obj)的许多用途。这是宏的定义:

#define PyArray_SIZE(m) PyArray_MultiplyList(PyArray_DIMS(m), PyArray_NDIM(m))

不存储它的好处是,不存储冗余数据。

答案 1 :(得分:2)

查看PyArray_ArrayDescr *PyArray_Descr.subarray

  

如果这是非NULL,则此数据类型描述符是C样式   另一个数据类型描述符的连续数组。换句话说,每个   此描述符描述的元素实际上是一些数组   其他基描述符。这作为数据类型描述符最有用   对于另一个数据类型描述符中的字段。字段成员应该   如果这是非NULL(基本描述符的字段成员),则为NULL   但是可以是非NULL。 PyArray_ArrayDescr结构已定义   使用

typedef struct {
    PyArray_Descr *base;
    PyObject *shape;      /* <-------- */
} PyArray_ArrayDescr;

PyObject *PyArray_ArrayDescr.shape
  

子数组的形状(总是C风格的连续)作为Python元组。