UPDATEIFCOPY标志是真的吗?

时间:2017-01-31 07:57:36

标签: python numpy

我试图更深入地理解numpy数组;特别是内存布局/所有权/共享相关方面。在那次努力中,我偶然发现了UPDATEIFCOPY标志,这听起来很有趣。 只有我从来没有真正看过它。 用户只能unset它。谷歌搜索" UPDATEIFCOPY True"如果你喜欢安静,那就非常轻松。

那么如何创建一个设置为True的标志的数组?

2 个答案:

答案 0 :(得分:2)

您可以设置当您使用np.nditer时(例如取自NumPy source code):

>>> import numpy as np

>>> a = np.arange(6, dtype='f4')
>>> i = np.nditer(a, [], [['readwrite', 'updateifcopy', 'aligned']])
>>> print(i.operands[0].flags)
  C_CONTIGUOUS : True
  F_CONTIGUOUS : True
  OWNDATA : True
  WRITEABLE : True
  ALIGNED : True
  UPDATEIFCOPY : False     # <--- :-(

但是,我不知道在什么情况下这是真的设置,因为如果我删除前两行,那么它就不再起作用了:

p={}
def a(arg2):
  #do something 

def b(arg2):
  #do something with arg 2

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='*******')
    parser.add_argument('-a',dest=a(p),action='store')
    parser.add_argument('-s',dest=b(sys.argv[3]), action='store')

    args = parser.parse_args
 

答案 1 :(得分:1)

UPDATEIFCOPY标志永远不能设置为True。

<强>更新

如果数组没有自己的内存,则base属性返回该数组引用其内存的对象。

返回的对象可能不是内存的原始分配器,但可能是从另一个对象借用它。如果此数组拥有自己的内存,则返回None,除非UPDATEIFCOPY标志为True,在这种情况下,self.base是删除self时将更新的数组。

对于作为常规数组的行为副本创建的数组,将自动设置UPDATEIFCOPY。目的是使未对齐的数组获得副本发生的任何更改。