如何判断NumPy是否创build视图或副本?

举个最简单的例子,让我们数字化一个二维数组。 numpy.digitize需要一个一维数组:

 import numpy as np N = 200 A = np.random.random((N, N)) X = np.linspace(0, 1, 20) print np.digitize(A.ravel(), X).reshape((N, N)) 

现在文档说 :

…只有在需要的情况下才能进行复制。

在这种情况下,我怎么知道这个ravel是否“需要”呢? 一般来说 – 有一种方法可以确定一个特定的操作是否创build一个副本或一个视图?

这个问题和我刚才问的一个问题非常相似:

您可以检查base属性。

 a = np.arange(50) b = a.reshape((5, 10)) print (b.base is a) 

但是,这并不完美。 你也可以使用np.may_share_memory检查它们是否共享内存。

 print (np.may_share_memory(a, b)) 

还有你可以检查的flags属性:

 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. 

但是这最后一个对我来说似乎有些蹊跷,虽然我不能指责为什么…

在重塑的文档中有一些有关如何确保如果无法查看视图的exception的信息:

在不复制数据的情况下,并不总是可以改变数组的形状。 如果您想要在复制数据时引发错误,则应将新形状分配给数组的shape属性:

 >>> a = np.zeros((10, 2)) # A transpose make the array non-contiguous >>> b = aT # Taking a view makes it possible to modify the shape without modiying the # initial object. >>> c = b.view() >>> c.shape = (20) AttributeError: incompatible shape for a non-contiguous array 

这不完全是你的问题的答案,但在某些情况下,它可能是一样有用的。