来自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数组的规范时,我没有看到它存储了数组的元素数量。那是真的吗?
不存储它有什么好处?
谢谢。
答案 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元组。