numpy:如果numpy数组是view,那么可靠的(非保守)指标

寻找一种方法可靠地确定一个numpy对象是否是一个视图。

相关的问题已经出现了很多次( 这里 , 这里 , 这里 ),人们提供了一些解决scheme,但似乎都有问题:

  • 现在在pandas使用的testing是在my_array.base is not None调用某个视图。 这似乎总是能够捕捉到意见,但也提供了大量的误报(即使报告不正确,报告的情况也是如此)。
  • numpy.may_share_memory()将检查两个特定的数组,但不会一般地回答
    • (@RobertKurn说,截至2012年是最好的工具 – 任何改变?)
  • flags['OWNDATA'])被报告(第三条评论的第一个答案)在某些情况下失败。

(我感兴趣的原因是我正在为大pandas实施抄写,而一个保守的指标正在导致过度复制。)

根据您的使用情况, flags['OWNDATA']将完成这项工作。 事实上,你的链接没有问题。 在某些情况下不会失败 。 它将永远做它应该做的事情。

根据http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.require.html :标志“确保拥有自己的数据的数组”。

在你的“反例”中,他们使用的代码是:

 print (b.flags['OWNDATA']) #False -- apparently this is a view e = np.ravel(b[:, 2]) print (e.flags['OWNDATA']) #True -- Apparently this is a new numpy object. 

但是,在第二种情况下,这是正常的行为。

它来自ravel的定义(来自http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.ravel.html )。

返回一个连续的扁平数组。 包含input元素的1-D数组被返回。 只有在需要时才进行复制。

在这里,需要一个副本,所以复制。 所以,variablese真的拥有自己的数据。 这不是“b的视图”,“对b的引用”,“b的一部分的别名”。 这是一个真正的新数组,其中包含b的一些元素的副本。

所以, 我认为如果不跟踪数据的全部来源来检测这种行为是不可能的 。 我相信你应该能够用这个标志build立你的程序。