NumPy的resize方法

16

有人能为我解释一下吗?(Python 3.3.2,numpy 1.7.1):

>>> a = np.array([[1,2],[3,4]])
>>> a    # just a peek
array([[1, 2],
       [3, 4]])
>>> a.resize(3,2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: cannot resize an array references or is referenced
by another array in this way.  Use the resize function
>>> a = np.array([[1,2],[3,4]])
>>> a.resize(3,2)
>>> a
array([[1, 2],
       [3, 4],
       [0, 0]])
>>> a = np.array([[1,2],[3,4]])
>>> print(a)   # look properly this time
[[1 2]
 [3 4]]
>>> a.resize(3,2)
>>> a
array([[1, 2],
       [3, 4],
       [0, 0]])
为什么看一眼数组会创建一个对它的引用?(或者至少,在我查看之后为什么这个引用仍然存在?)此外,是只有我觉得那个异常需要重写一下吗?

2
不仅仅是你。异常信息在“references”前缺少“which”,并且需要适当的标点和大写字母。 - Neil Traft
1个回答

16

根据文档(重点标注为我的部分):

引用计数检查的目的是确保您不将此数组用作另一个Python对象的缓冲区,然后重新分配内存。但是,引用计数可以通过其他方式增加,因此,如果您确定未与其他Python对象共享此数组的内存,则可以安全地将refcheck设置为False

print不同,您的“peek”不会在此之后减少引用计数。这是因为,在解释器中,最后计算的结果被分配给_。尝试:

print(_) # shows array
a.resize((3, 2), refcheck=False) # works

或者,如果您在其中进行任何其他计算(例如只是1+2),这将从_中取消引用您的数组。


有意义(比错误消息更有意义)。也许这不应该,但是......我理解创建一个数组视图会创建一个引用 - 还有什么其他操作是这样的呢? - xnx
2
在这种情况下,这仅仅是因为您正在使用解释器,它将最后一次计算的结果分配给“_”。我同意错误消息并不是非常有帮助! - jonrsharpe
明白了!我之前其实不知道_这个功能。真是隐秘...谢谢! - xnx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接