对于最小的工作示例,让我们数字化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))
......仅在需要时才制作副本。
在这种情况下,如何知道ravel
副本是否“需要”?通常 - 有没有办法可以确定特定操作是创建副本还是视图?
答案 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
这不是你问题的答案,但在某些情况下,它可能同样有用。