gpt4 book ai didi

python - numpy:如果 numpy 数组是 View ,则可靠(非保守)指示符

转载 作者:IT老高 更新时间:2023-10-28 20:36:51 24 4
gpt4 key购买 nike

寻找一种方法来可靠地识别 numpy 对象是否是 View 。

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

  • 现在pandas 中使用的测试是在my_array.base 不是None 时调用某个 View 。这似乎总能捕获 View ,但也提供了许多误报(它报告某些内容的情况是 View ,即使它不是 View )。
  • numpy.may_share_memory() 将检查两个特定数组,但一般不会回答
    • (@RobertKurn 说它是 2012 年最好的工具——有什么变化吗?)
  • flags['OWNDATA'])reported (third comment first answer)在某些情况下失败。

(我感兴趣的原因是我正在为 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.

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

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

Return a contiguous flattened array. A 1-D array, containing the elements of the input, is returned. A copy is made only if needed.

这里需要一个副本,所以制作了一个副本。因此,变量 e 真正拥有自己的数据。它不是“b 的 View ”、“对 b 的引用”、“b 的一部分的别名”。这是一个真正的新数组,包含 b 的一些元素的副本。

所以,我认为如果不跟踪数据的整个来源来检测这种行为是不可能的。我相信您应该能够使用该标志构建您的程序。

关于python - numpy:如果 numpy 数组是 View ,则可靠(非保守)指示符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33530753/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com