如何判断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
这不完全是你的问题的答案,但在某些情况下,它可能是一样有用的。