2014-07-01 17 views
5

Kiedy mam a=1 i b=2 mogę napisać a,b=b,a tak że a i b są zamienione ze sobą.Zamiana Kolumny z tablic numpy

Używam tego macierz jako tablicy:

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

zamiana kolumn z numpy tablicy nie działa:

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] 

To daje:

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

Więc x[:,1] ma zostały po prostu nadpisane i nie zostały przesłane do x[:,2].

Dlaczego tak się dzieje?

+2

Dobre pytanie. Działa zgodnie z oczekiwaniami na zwykłych listach, np. 'd = [0,1,2,3]; d [: 2], d [2:] = d [2:], d [: 2] 'daje' [2, 3, 0, 1] ' –

Odpowiedz

6

Jeśli próbujesz zamienić kolumny można to zrobić przez

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

wyjściu

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

Sposób zamiana wspomniał Pan w pytaniu wydaje się działać dla tablic jednowymiarowych i zawiera listę,

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

wyjście

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

Podczas korzystania składni x[:] = y[:] z numpy tablicy, wartości y są kopiowane bezpośrednio do X; nie tworzy się tymczasowych. Więc kiedy robisz x[:, 1], x[:,2] = x[:, 2], x[:, 1], najpierw trzecia kolumna x jest kopiowana bezpośrednio do drugiej kolumny, a następnie druga kolumna jest kopiowana bezpośrednio do trzeciej.

Druga kolumna została już zastąpiona wartościami z trzeciej kolumny przed skopiowaniem drugiej kolumny do trzeciej, więc kończy się oryginalnymi wartościami w trzeciej kolumnie.

Numpy został zaprojektowany tak, aby w miarę możliwości unikać kopii, aby poprawić wydajność. Ważne jest, aby zrozumieć, że list[:] zwraca kopię listy, podczas gdy np.array[:] zwraca view of the numpy array.

Powiązane problemy