Подтвердить что ты не робот

Метод изменения размера NumPy

Кто-нибудь может мне это объяснить? (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]])

Почему заглядывание в массив создает ссылку на него? (или, по крайней мере, почему эта ссылка сохраняется после того, как я все-таки посмотрел?) Кроме того, это только я или этот Exception нуждается в переписывании?

4b9b3361

Ответ 1

Из документации (акцент мой):

Цель проверки счетчика ссылок состоит в том, чтобы убедиться, что вы не используете этот массив в качестве буфера для другого объекта Python, а затем перераспределите память. Однако подсчет ссылок может увеличиваться другими способами, поэтому, если вы уверены, что вы не поделили память для этого массива другим объектом Python, вы можете безопасно установить refcheck на False.

Ваш "заглянуть", в отличие от print, не уменьшает счетчик ссылок впоследствии. Это связано с тем, что в интерпретаторе результат последнего вычисления присваивается _. Пытаться:

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

Кроме того, если вы выполняете какое-либо другое вычисление (например, только 1 + 2) между ними, это приведет к разыменованию вашего массива с помощью _.