2016-06-20 2 views
0

Es gibt ein paar Fragen zu SO über die Überprüfung, ob der numpy.reshape Aufruf eine Kopie zurückgegeben hat oder nicht [1, 2]. Diese Fragen werden im Allgemeinen aufgrund der vagen Warnung des Dokuments gestellt:Warum würde NumPy reshape() ein neues Array erstellen und warum könnte die Reihenfolge nicht beibehalten werden?

Dies wird ein neues Ansichtsobjekt, wenn möglich; Andernfalls wird es eine Kopie sein.

Ich frage mich, unter welchen Umständen wird NumPy eine Kopie zurückgeben? In jedem 2D-Anruf, den ich getestet habe, zeigt die Methode aus der Antwort des Benutzers jterrace in 2, dass die Speicherbasis dieselbe ist (d. H. Keine Kopie). Ist es nur für höherdimensionale reshape, dass eine Kopie notwendig sein kann?

Zusätzlich informiert der zweite Teil der Warnung von dem docs der Benutzer, dass:

... es gibt keine Garantie für das Speicherlayout ist (C- oder aus Fortran zusammenhängenden) des zurückgegebenen Arrays.

Mit anderen Worten, Sie können nach Zeilenmajor fragen, aber Sie könnten Spalte-Hauptausgabe erhalten. Behebt dies nicht den ganzen Zweck des order Parameters? Wann würde dieser Fall entstehen?

Antwort

2

Ich frage mich, unter welchen Umständen wird NumPy eine Kopie zurückgeben?

In [13]: x = numpy.array([[1, 2, 3], 
    ....:     [4, 5, 6]]) 

In [14]: x[:, :2].reshape([4]).base is x 
Out[14]: False 

Wenn die Schritte für die neue Form nicht funktionieren, hat NumPy zu kopieren.

Mit anderen Worten, Sie können nach Zeilenmajor fragen, aber Sie könnten Spalte-Hauptausgabe erhalten. Behebt dies nicht den ganzen Zweck des order Parameters?

Nr. numpy.reshape bietet keine Möglichkeit, nach einem bestimmten Speicherlayout zu fragen. Der Parameter order gibt an, in welcher Indexreihenfolge Elemente gelesen werden sollen. Es hat nichts mit Speicherlayout zu tun.

+0

Mit anderen Worten, um das gewünschte * Speicherlayout * zu erhalten, müsste man es explizit in eine Kopie im Speicher schreiben? – marcman

+0

Um zu erarbeiten, dass die letzte Umformung "Array ([1, 2, 4, 5])", eine Teilmenge des ursprünglichen "[1,2,3,4,5,6]" erzeugt. – hpaulj

+0

@marcman: Sie müssten 'numpy.copy' oder etwas aufrufen. – user2357112

Verwandte Themen