nic*_*_eu 45 python arrays numpy pandas
寻找一种可靠地识别numpy对象是否为视图的方法.
相关问题在此之前(这里,这里,这里)出现了很多次,人们提供了一些解决方案,但似乎都有问题:
pandas现在使用的测试是调用某个视图my_array.base is not None.这似乎总是捕捉到观点,但也提供了许多误报(即使它不是,它报告某些东西是一种观点的情况).numpy.may_share_memory() 将检查两个特定的数组,但不会回答一般
flags['OWNDATA'])被报道(第三评论第一个答案)在某些情况下失败.(我感兴趣的原因是我正在为大熊猫实施写时复制,而保守的指标导致过度复制.)
根据您的用途,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.
Run Code Online (Sandbox Code Playgroud)
但是,在第二种情况下, True 是正常行为。
ravel它来自(来自http://docs.scipy.org/doc/numpy-1.10.1/reference/ generated/numpy.ravel.html)的定义。
返回连续的展平数组。返回包含输入元素的一维数组。仅在需要时才制作副本。
这里需要一份副本,所以就制作了一份。所以,变量 e 确实拥有自己的数据。它不是“b 的视图”、“对 b 的引用”、“b 的一部分的别名”。这是一个真正的新数组,包含 b 的一些元素的副本。
所以,我认为如果不跟踪数据的整个来源就不可能检测到这种行为。我相信您应该能够使用该标志构建您的程序。
| 归档时间: |
|
| 查看次数: |
934 次 |
| 最近记录: |