如何判断NumPy是创建视图还是副本?

时间:2012-07-17 14:26:06

标签: python numpy copy

对于最小的工作示例,让我们数字化2D数组。 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))

现在是documentation says

  

......仅在需要时才制作副本。

在这种情况下,如何知道ravel副本是否“需要”?通常 - 有没有办法可以确定特定操作是创建副本还是视图?

2 个答案:

答案 0 :(得分:64)

这个问题与我前一段时间问过的question非常相似:

您可以查看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.

但最后一个对我来说似乎有点可疑,虽然我不能完全理解为什么......

答案 1 :(得分:17)

reshape的文档中,有一些信息表明如果无法创建视图,如何确保异常:

  

在不复制数据的情况下,无法始终更改阵列的形状。如果要在复制数据时引发错误,则应将新形状分配给数组的shape属性:

>>> a = np.zeros((10, 2))
# A transpose make the array non-contiguous
>>> b = a.T
# 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



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