首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何判断NumPy是创建视图还是复制?

如何判断NumPy是创建视图还是复制?
EN

Stack Overflow用户
提问于 2012-07-17 14:26:05
回答 2查看 18.6K关注 0票数 85

对于一个最小的工作示例,让我们数字化一个2D数组。numpy.digitize需要一个一维数组:

代码语言:javascript
复制
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副本是否“需要”?一般来说,是否有一种方法可以确定特定的操作是创建副本还是创建视图?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-17 14:30:03

这个问题与我之前问过的问题非常相似:

您可以检查base属性。

代码语言:javascript
复制
a = np.arange(50)
b = a.reshape((5, 10))
print (b.base is a)

然而,这并不完美。您还可以检查它们是否使用np.may_share_memory共享内存。

代码语言:javascript
复制
print (np.may_share_memory(a, b))

还有可以检查的标志属性:

代码语言:javascript
复制
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.

但对我来说最后一个有点可疑,虽然我不太清楚为什么.

票数 89
EN

Stack Overflow用户

发布于 2013-01-11 03:40:59

重塑的文档中,有一些关于在无法创建视图时如何确保异常的信息:

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

代码语言:javascript
复制
>>> 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

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

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11524664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档