对于一个最小的工作示例,让我们数字化一个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副本是否“需要”?一般来说,是否有一种方法可以确定特定的操作是创建副本还是创建视图?
发布于 2012-07-17 14:30:03
这个问题与我之前问过的问题非常相似:
您可以检查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))还有可以检查的标志属性:
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.但对我来说最后一个有点可疑,虽然我不太清楚为什么.
发布于 2013-01-11 03:40:59
在重塑的文档中,有一些关于在无法创建视图时如何确保异常的信息:
在不复制数据的情况下,不总是可以更改数组的形状。如果希望在复制数据时引发错误,则应将新形状分配给数组的形状属性:
>>> 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这并不完全是你的问题的答案,但在某些情况下,它可能是同样有用的。
https://stackoverflow.com/questions/11524664
复制相似问题