2013-12-22 5 views
13

Kann mir das jemand erklären? (Python 3.3.2, numpy 1.7.1):NumPy Resize-Methode

>>> 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]]) 

Warum einen Blick auf das Array nicht nehmen, um es einen Verweis erstellen? (oder, zumindest, warum bleibt diese Referenz bestehen, nachdem ich fertig bin?) Auch, ist es nur ich oder braucht die Ausnahme ein bisschen eine Neuschreibung?

+2

Es ist nicht nur du. Der Ausnahmebedingung fehlt ein "which" vor "references" und könnte eine gesunde Dosis von Interpunktion und Großschreibung verwenden. –

Antwort

10

Vom documentation (Hervorhebung von mir):

Der Zweck der Prüfung Referenzzähler Sie sicherstellen, dass dieses Array nicht für einen anderen Python-Objekt als Puffer verwenden und dann den Speicher neu zuzuordnen. Referenzzählungen können jedoch auf andere Weise zunehmen. Wenn Sie also sicher sind, dass Sie den Speicher für dieses Array nicht mit einem anderen Python-Objekt geteilt haben, können Sie sicher refcheck auf False setzen.

Ihr "peek" verringert im Gegensatz zu print die Referenzzählung nicht. Dies liegt daran, dass im Interpreter das Ergebnis der letzten Berechnung _ zugewiesen wird. Versuchen:

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

Alternativ, wenn Sie eine andere Berechnung tun (zum Beispiel nur 1 + 2) dazwischen, diesen Willen dereferenzieren Ihr Array von _.

+0

Sinn machen (mehr als die Fehlermeldung). Vielleicht sollte es aber nicht ... Ich verstehe, dass das Erstellen einer Sicht auf ein Array eine Referenz erzeugt - welche anderen Operationen tun das? – xnx

+2

In diesem Fall ist es nur, weil Sie den Interpreter verwenden, der das Ergebnis der letzten Berechnung an _ _ zuweist. Ich stimme zu, dass die Fehlermeldung nicht sehr hilfreich ist! – jonrsharpe

+0

Verstanden! Ich wusste eigentlich nichts von _ bis jetzt. Hinterhältig ... Danke! – xnx