2011-02-01 35 views
37
from numpy import * 
def swap_columns(my_array, col1, col2): 
    temp = my_array[:,col1] 
    my_array[:,col1] = my_array[:,col2] 
    my_array[:,col2] = temp 

Sau đóHoán đổi cột trong một mảng có nhiều mảng?

swap_columns(data, 0, 1) 

Không làm việc. Tuy nhiên, hãy gọi mã trực tiếp

temp = my_array[:,0] 
my_array[:,0] = my_array[:,1] 
my_array[:,1] = temp 

Có. Tại sao điều này xảy ra và làm thế nào tôi có thể sửa chữa nó? Lỗi nói "IndexError: 0-d mảng chỉ có thể sử dụng một() hoặc một danh sách các newaxes (và một duy nhất ...) như là một chỉ mục", trong đó ngụ ý các đối số không phải là ints? Tôi đã thử chuyển đổi cols thành int nhưng điều đó không giải quyết được.

+0

liên quan: [cách nhanh nhất để trao đổi hai cột và cùng là gì các hàng của ma trận 2D?] (http://stackoverflow.com/q/42955355/562769) –

Trả lời

72

Có hai vấn đề ở đây. Đầu tiên là data bạn chuyển đến chức năng của bạn rõ ràng không phải là mảng NumPy hai chiều - ít nhất đây là thông báo lỗi nói.

Vấn đề thứ hai là mã số không làm những gì bạn mong đợi:

my_array = numpy.arange(9).reshape(3, 3) 
# array([[0, 1, 2], 
#  [3, 4, 5], 
#  [6, 7, 8]]) 
temp = my_array[:, 0] 
my_array[:, 0] = my_array[:, 1] 
my_array[:, 1] = temp 
# array([[1, 1, 2], 
#  [4, 4, 5], 
#  [7, 7, 8]]) 

Vấn đề là NumPy basic slicing không tạo ra các bản sao của dữ liệu thực tế, mà đúng hơn là một cái nhìn để cùng một dữ liệu. Để thực hiện việc này, bạn có phải sao chép một cách rõ ràng

temp = numpy.copy(my_array[:, 0]) 
my_array[:, 0] = my_array[:, 1] 
my_array[:, 1] = temp 

hoặc sử dụng advanced slicing

my_array[:,[0, 1]] = my_array[:,[1, 0]] 
+0

Sven bạn có thể chỉnh sửa câu trả lời của mình không? Tôi dường như vô tình bị bỏ phiếu khi sử dụng điện thoại của tôi ... – gary

+0

@gary comtois: Cảm ơn bạn đã bình luận - đã chỉnh sửa ngay bây giờ :) –

+0

Cắt nâng cao cũng không xuất hiện để sao chép dữ liệu. –

10

Xây dựng trên @ Sven của câu trả lời:

import numpy as np 
my_array = np.arange(9).reshape(3, 3) 
print my_array 

[[0 1 2] 
[3 4 5] 
[6 7 8]] 

def swap_cols(arr, frm, to): 
    arr[:,[frm, to]] = arr[:,[to, frm]] 

swap_cols(my_array, 0, 1) 
print my_array 

[[1 0 2] 
[4 3 5] 
[7 6 8]] 

def swap_rows(arr, frm, to): 
    arr[[frm, to],:] = arr[[to, frm],:] 

my_array = np.arange(9).reshape(3, 3) 
swap_rows(my_array, 0, 2) 
print my_array 

[[6 7 8] 
[3 4 5] 
[0 1 2]] 
12

tôi tìm ra sau nhanh nhất:

my_array[:, 0], my_array[:, 1] = my_array[:, 1], my_array[:, 0].copy() 

Thời gian phân tích:

import numpy as np 
my_array = np.arange(900).reshape(30, 30) 

là như sau:

%timeit my_array[:, 0], my_array[:, 1] = my_array[:, 1], my_array[:, 0].copy() 
The slowest run took 15.05 times longer than the fastest. This could mean that an intermediate result is being cached 
1000000 loops, best of 3: 1.72 µs per loop 

Giờ cắt tiên tiến là:

%timeit my_array[:,[0, 1]] = my_array[:,[1, 0]] 
The slowest run took 7.38 times longer than the fastest. This could mean that an intermediate result is being cached 
100000 loops, best of 3: 6.9 µs per loop 
+0

Upvote cho phần copy(), tôi đã bỏ lỡ điều này trong mã của tôi. –

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