2016-12-18 2 views
2

Das folgende Beispiel ist für mich seltsam. Die Arrays a und c sind unterschiedlich, aber bei der Modifikation des ersten Elements von a ändert sich auch das erste Element von c. Warum ist das numpy Array so implementiert? Wenn a als Liste zugewiesen ist, ändert das Ändern des ersten Elements von a nicht das erste Element von c. Ich kann mir kein Beispiel vorstellen, bei dem das Verhalten des Arrays numpy gewünscht wäre.Seltsame Kopie Konstruktion von numpy Array

import numpy as np 

a = np.arange(3,5) 
#a = [3, 4] 
b = a 
c = a[:] 
d = a.copy() 

print(a is b) # True 
print(a is c) # False 
print(a is d) # False 

print(a, b, c, d) #[3 4] [3 4] [3 4] [3 4] 

a[0] = -11. 

print(a, b, c, d) #[-11 4] [-11 4] [-11 4] [3 4] HUH?! 
+0

'a [:]' ist für Listen und Arrays unterschiedlich; Die Indizierungsmethoden '__getitem__' sind anders. – hpaulj

Antwort

3

Einfache Numpy Scheiben geben eine Ansicht, keine kopieren. Wie der Name andeutet, wird eine Ansicht mit den gleichen Daten gesichert, nur anders dargestellt. Dies ist ein Teil von dem, was Numpy so schnell macht, da es nicht jedes Mal Kopien der Daten erstellen muss, wenn Sie Slice schneiden.

Siehe the docs.

Ich kann nicht einen Grund denken, warum c=a[:] wäre nützlich, aber c=a[::2] könnte nützlich sein. Nehmen wir an, ich bekomme den Durchschnitt von jedem anderen Element und erhöhe dann diese um diesen Durchschnittswert.

Es gibt einfach keinen Grund, Ihr Beispiel zu spezialisieren, um eine Kopie anstelle einer Ansicht zurückzugeben. In der Tat wäre es ziemlich kontraintuitiv für Leute, die damit vertraut sind, wie Numpy Slices funktionieren.

+0

Können Sie ein Beispiel finden, bei dem eine 'c = a [:]' Art der Zuweisung gewünscht wird? – Chiel

+0

@Chiel Man wäre da, wo du vielleicht alle Elemente zu etwas verändern möchtest: 'a [:] = etwas '. In dieser Form wäre es "c = etwas", nachdem Sie "c = a [:]" haben. – Divakar

+0

@Divakar Das ist das umgekehrte Beispiel. – Chiel