非连续拥有 numpy 数组:它们是否存在以及何时期望它们



我想知道是否存在拥有其数据的 numpy 数组不连续存储的情况。

从数字角度来看,非连续、行对齐或列对齐的缓冲区是有意义的,并且在性能库(如 IPP(中无处不在。但是,默认情况下,numpy 似乎会将作为array参数传递的任何内容转换为连续缓冲区。据我了解,这在文档中并没有真正明确说明。

我的问题是,numpy 是否保证使用np.array创建的任何拥有数组在内存中都是连续的?更一般地说,在哪些情况下我们会遇到不连续的拥有数组?

按照@Eelco的回答进行编辑

通过不连续,我的意思是用于存储数据的内存块中有一些"空白空间"(如果您愿意,可以strides[1] > shape[0] * itemsize(。我并不是说使用两个或多个内存分配存储数据的数组 — 我会惊讶于存在这样一个拥有的 numpy 数组。根据这个答案,这似乎与numpy的术语一致。

通过拥有数组,我的意思是其.flags.owndata=True数组.我对那些确实可以疯狂行事的非拥有数组不感兴趣。

我听说(没有来源,对不起(,实际上所有拥有内存的数组都是连续的。这是有道理的;您如何拥有不连续的街区?这意味着当收集该假设对象时,您必须进行任意数量的碎片释放调用......我认为这甚至是不可能的;我认为只能释放最初分配的范围。从另一边看;所有权源于分配时;而且我们只能分配连续的块。(至少它是在malloc级别上的工作方式;你可以在实现逻辑来处理这种碎片化所有权的分配层之上有一个基于软件的分配层;但如果有任何这样的事情存在,那对我来说是新闻(。

Ive为jsonpickle贡献了扩展其numpy支持,这个问题也出现了。我在那里编写的代码会破坏(而且非常可怕(,如果有人给它一个不连续的拥有数组;一年多了,我没有看到任何问题被报告;所以这是相当有力的经验证据 id 说...

但是,如果您仍然担心这会导致难以跟踪的错误(我认为构建 numpy 数组的 C lib 可以达到的恶作剧没有限制(,id 建议简单地在运行时断言这样的弗兰肯阵列永远不会意外地传递到错误的地方。

最新更新