我想知道是否存在任何非连续存储拥有其数据的numpy数组的情况。
从数值的角度来看,非连续的行或列对齐缓冲区是有意义的,并且在诸如IPP的性能库中无处不在。但是,默认情况下numpy似乎将作为array
的参数传递的任何内容转换为连续的缓冲区。据我所知,documentation并没有明确说明这一点。
我的问题是,numpy是否保证使用np.array
创建的任何拥有数组在内存中是连续的?更一般地说,在哪种情况下我们可以遇到一个不连续的拥有数组?
编辑
非连续,我的意思是用于存储数据的内存块中有一些“空格”(如果愿意的话,strides[1] > shape[0] * itemsize
)。我 not 意味着一个数组,其数据是使用两个或多个内存分配存储的 - 我会惊讶于这样一个拥有的numpy数组存在。这似乎与numpy的术语according to this answer一致。
拥有数组,我指的是.flags.owndata=True
的数组。我对那些可以表现得非常疯狂的非拥有阵列不感兴趣。
答案 0 :(得分:0)
我听说过(没有消息来源,对不起),确实所有拥有内存的阵列都是连续的。这是有道理的;你怎么能拥有一个不连续的区块?这意味着当收集该假设对象时,你必须进行任意数量的碎片释放调用......而且我认为这甚至不可能;我认为只能释放最初分配的范围。从另一边看;所有权源于分配时;我们只能分配连续的块。 (至少那就是它在malloc级别上是如何工作的;你可以在它之上有一个基于软件的分配层,它实现处理这种分散的所有权的逻辑;但是如果有任何这样的东西对我来说是新闻)。
我为jsonpickle做出了贡献,以扩大其numpy支持,并且还出现了这个问题。我在那里写的代码会破坏(而且非常可怕),如果有人要为它提供一个非连续的拥有数组;已经有一年多的时间了,我看到有任何问题被报道过;所以相当强大的经验证据可以说......
但是如果你仍然担心这会导致很难跟踪错误(我不认为对于构建numpy数组的C lib可以起作用的恶作剧有限制),id建议只是在运行时断言没有这样的错误frankenarrays不小心被传递到了错误的地方。