2014-07-01 34 views
5

Wenn ich a=1 und b=2, kann ich a,b=b,a schreiben, so dass a und b miteinander vertauscht sind.Spalten vertauschen mit NumPy Arrays

Ich benutze diese Matrix als Array:

[ 1, 2, 0, -2] 
    [ 0, 0, 1, 2] 
    [ 0, 0, 0, 0] 

die Spalten einer numpy Array Swapping funktioniert nicht:

import numpy as np 

x = np.array([[ 1, 2, 0, -2], 
    [ 0, 0, 1, 2], 
    [ 0, 0, 0, 0]]) 

x[:,1], x[:,2] = x[:,2], x[:,1] 

Es ergibt:

[ 1, 0, 0, -2] 
    [ 0, 1, 1, 2] 
    [ 0, 0, 0, 0] 

So x[:,1] hat einfach überschrieben und nicht an x[:,2] übertragen.

Warum ist das der Fall?

+2

Gute Frage. Es funktioniert wie erwartet mit regulären Listen, z.B. "d = [0,1,2,3]; d [: 2], d [2:] = d [2:], d [: 2] ergibt "[2, 3, 0, 1]" –

Antwort

6

Wenn Sie versuchen, Spalten tauschen Sie können es durch

print x 
x[:,[2,1]] = x[:,[1,2]] 
print x 

Ausgang

[[ 1 2 0 -2] 
[ 0 0 1 2] 
[ 0 0 0 0]] 
[[ 1 0 2 -2] 
[ 0 1 0 2] 
[ 0 0 0 0]] 

Die Swapping Methode, die Sie in der Frage erwähnt scheint für eindimensionale Arrays zu arbeiten und Listen aber,

x = np.array([1,2,0,-2]) 
print x 
x[2], x[1] = x[1], x[2] 
print x 

Ausgang

[ 1 2 0 -2] 
[ 1 0 2 -2] 
8

Wenn Sie die x[:] = y[:] Syntax mit einem numpy Array verwenden, werden die Werte von y in x direkt kopiert; Es werden keine Provisorien erstellt. Wenn Sie also x[:, 1], x[:,2] = x[:, 2], x[:, 1] tun, wird zuerst die dritte Spalte von x direkt in die zweite Spalte kopiert, und dann wird die zweite Spalte direkt in die dritte Spalte kopiert.

Die zweite Spalte wurde bereits durch die Werte der dritten Spalte überschrieben, wenn Sie die zweite Spalte in die dritte Spalte kopieren. Sie erhalten also die ursprünglichen Werte in der dritten Spalte.

Numpy wurde entwickelt, um Kopien zu vermeiden, wo dies möglich ist, um die Leistung zu verbessern. Es ist wichtig zu verstehen, dass list[:] eine Kopie der Liste zurückgibt, während np.array[:] eine view of the numpy array zurückgibt.