2017-01-31 32 views
2

我想深入了解numpy数组;特别是内存布局/所有权/共享相关方面。在那个努力中,我偶然发现了听起来很有趣的UPDATEIFCOPY标志。 只有我从没见过它。 用户只能unset它。如果你喜欢它,安静地搜索“UPDATEIFCOPY True”会非常轻松。是否为UPDATEIFCOPY标志?

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

+0

我认为UPDATEIFCOPY机制应该只在内部使用。所以在numpy源代码或C扩展中。在Python端拥有这样一个数组对用户来说是非常不友好的。 numpy中的一个重要用例似乎是处理错位,错误数据类型的'out'参数,或者不处理C-contiguous [code-explanations.rst](https://github.com/numpy/numpy/)斑点/ v1.12.0/DOC /源极/参考/ internals.code-explanations.rst)。 – user7138814

+0

@ user7138814经过这么长时间的一个连贯的答案。非常感谢,确实!所以就这么简单。但是,MSeifert为他的答案挖出了那个例子呢? –

+0

我想当你将'updateifcopy''标志传递给'nditer'时,你应该知道你在做什么;-)示例中的前两行创建一个未对齐的数组,而'nditer'命令对齐的阵列。所以它按预期工作。 – user7138814

回答

2

您可以设置当您使用np.nditer(从NumPy source code采取为例):

>>> import numpy as np 
>>> a = np.zeros((6*4+1,), dtype='i1')[1:] 
>>> a.dtype = 'f4' 
>>> 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 : True  # <--- :-) 

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

>>> 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  # <--- :-(
+0

技术上,这回答我的问题,所以我接受它。我想两个答案都可以一起解决,一旦我的大脑停止旋转,我可能会解决这个问题。 –

1

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

UPDATE

如果数组不拥有其自己的存储器,则该基本属性返回其内存这个阵列被引用对象。

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

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

+0

你这样做的目的不是吗?我认为它要求一个人可读的版本是不可能的?无论如何,在这里,有一个upvote为您的麻烦;-) –

+0

我想我不能让它更容易,英语不是我的主要语言,所以它会很困难:) – Svekke

相关问题