2014-07-01 37 views
5

Khi tôi có a=1b=2, tôi có thể viết a,b=b,a để ab được hoán đổi với nhau.Hoán đổi Cột với các mảng NumPy

tôi sử dụng ma trận này là một mảng:

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

Việc trao đổi các cột của một mảng NumPy không hoạt động:

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] 

Nó mang lại:

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

Vì vậy x[:,1] đã chỉ bị ghi đè và không được chuyển đến x[:,2].

Tại sao lại xảy ra trường hợp này?

+2

Câu hỏi hay. Nó hoạt động như mong đợi với các danh sách thông thường, ví dụ: 'd = [0,1,2,3]; d [: 2], d [2:] = d [2:], d [: 2] 'hiệu suất' [2, 3, 0, 1] ' –

Trả lời

6

Nếu bạn đang cố gắng trao đổi cột bạn có thể làm điều đó bằng cách

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

đầu ra

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

Phương pháp trao đổi bạn đề cập trong câu hỏi dường như được làm việc cho mảng chiều đơn và danh sách mặc dù,

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

đầu ra

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

Khi bạn sử dụng cú pháp x[:] = y[:] với một mảng NumPy, các giá trị của y được sao chép trực tiếp vào x; không có thời gian được thực hiện. Vì vậy, khi bạn làm x[:, 1], x[:,2] = x[:, 2], x[:, 1], đầu tiên cột thứ ba của x được sao chép trực tiếp vào cột thứ hai, sau đó cột thứ hai được sao chép trực tiếp vào cột thứ ba.

Cột thứ hai đã bị ghi đè bởi giá trị cột thứ ba theo thời gian bạn sao chép cột thứ hai sang cột thứ ba, vì vậy bạn kết thúc với giá trị ban đầu trong cột thứ ba.

Numpy được thiết kế để tránh các bản sao nếu có thể để cải thiện hiệu suất. Điều quan trọng là phải hiểu rằng list[:] trả về một bản sao của danh sách, trong khi np.array[:] trả về một view of the numpy array.

Các vấn đề liên quan