【问题标题】:Does numpy internally store size of an array?numpy 是否在内部存储数组的大小?
【发布时间】:2016-09-07 19:41:13
【问题描述】:

来自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 数组的规范时,我没有看到它存储了数组元素的数量。真的是这样吗?

不存储有什么好处?

谢谢。

【问题讨论】:

  • 然而,它看起来好像存储了维度和步幅的数组。在大多数涉及数组操作的实现中,这是实际需要的信息,而不是项目总数,这无助于您系统地访问它们。
  • 我想我现在明白了。当数组的大小很大时,将维度相乘得到大小只需要一小部分时间即可完成整个计算。

标签: python c numpy


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案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
    

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

    【讨论】:

      猜你喜欢
      • 2020-12-23
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-01
      • 2017-11-21
      • 2015-09-25
      • 2019-02-03
      • 2017-01-04
      相关资源
      最近更新 更多