2015-11-04 25 views
45

寻找一种方法来可靠地识别numpy对象是否是一个视图。numpy:可靠(非保守)指标,如果numpy数组是查看

相关问题已经提出了很多次(hereherehere),人们已经提出了一些解决方案,但都似乎有问题:

  • 现在pandas使用的测试是指对某事物一个视图如果my_array.base is not None。这似乎总是能够捕捉到意见,但也提供了大量的误报(即使它不是报告某种情况的视图)。
  • numpy.may_share_memory()将检查两个特定的阵列,但不会回答一般
    • (@RobertKurn说是为2012年最佳工具 - ?任何更改)
  • flags['OWNDATA'])reported (third comment first answer)在失败一些案例。

(原因我感兴趣的是,我正在执行写入时复制的大熊猫,以及保守的指标是导致过度复制。)

+4

关于numpy github跟踪器的相关讨论:https://github.com/numpy/numpy/issues/5604 –

+3

描述为误报的情况似乎是当“创建副本”的操作实际上返回复印件。如果这被认为是“不是视图”,你可以尝试检查数组“base”的refcount以查看是否有其他引用,但这不会是完美的。我不认为有可能可靠地检测到这种事情。 – user2357112

+6

也看到这个最近的SO问题,http://stackoverflow.com/questions/33467477/how-to-find-all-variables-with-identical-id。它提到了一个新的函数'np.shares_memory'。但是我在那里指出,比较两个已知变量是一回事,要问的另一个问题是数组与其他数组共享数据缓冲区。 – hpaulj

回答

1

根据您的用途,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)的定义。

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

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

所以,我认为这是不可能的,没有跟踪数据的整个来源来检测这种行为。我相信你应该可以用这个标志来建立你的程序。