NumPy调整大小的方法

xnx*_*xnx 15 python resize numpy exception

任何人都可以向我解释这个吗?(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]])
Run Code Online (Sandbox Code Playgroud)

为什么看一下数组会创建一个引用呢?(或者,至少,为什么在我看完之后这个引用仍然存在?)另外,它只是我还是那个Exception需要重写一下?

jon*_*rpe 14

文档(强调我的):

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

与之不同print,你的"偷看" 并不会减少参考计数.这是因为,在解释器中,分配了最后一次计算的结果_.尝试:

print(_) # shows array
a.resize((3, 2), refcheck=False) # works
Run Code Online (Sandbox Code Playgroud)

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

  • 在这种情况下,这只是因为你正在使用解释器,它将最后一次计算的结果分配给`_`.我同意错误消息不是非常有用! (2认同)