2012-06-07 37 views
7

Tôi có một ma trận NumPy mà tôi đã đơn giản hóa để minh hoạ:Sắp xếp lại Matrix Elements với NumPy

 a b c d e f 
A = [[0, 1, 2, 3, 4, 5], 
b [1, 0, 3, 4, 5, 6], 
c [2, 3, 0, 5, 6, 7], 
d [3, 4, 5, 0, 7, 8], 
e [4, 5, 6, 7, 0, 9], 
f [5, 6, 7, 8, 9, 0]] 

nơi số tại "nút giao thông" là quan trọng, nhưng thứ tự của chúng là không đúng. Tôi muốn sắp xếp lại các hàng và cột sao cho thứ tự mới là [a, d, b, e, c, f] nhưng giá trị này mà tôi gọi là "giao lộ" là giống nhau.

Dưới đây tôi đã bắt đầu chuyển đổi ma trận theo cách tôi muốn. Điền hàng 'e' liên quan đến việc xem xét các giao điểm trên cho (e, a) (= 4), sau đó (e, d) (= 7), sau đó (e, b) (= 5), (e, e) , (e, c) và (e, f)

 a d b e c f 
A1= [[0, 3, 1, 4, 2, 5], 
d [3, 0, 4, 7, 5, 8], 
b [1, 4, 0, 5, 3, 6], 
e [4, 7, 5, 

Mọi người có thể đề xuất cách sắp xếp lại ma trận theo cách này không?

+0

Điều này có thể giúp: http://stackoverflow.com/a/4857981/1142167 –

Trả lời

12

chỉnh sửa: Tôi chỉ cần stumbled trên một giải pháp NumPy sử dụng advanced indexing:

#     a b c d e f 
A = numpy.array([[0, 1, 2, 3, 4, 5], 
       [1, 0, 3, 4, 5, 6], 
       [2, 3, 0, 5, 6, 7], 
       [3, 4, 5, 0, 7, 8], 
       [4, 5, 6, 7, 0, 9], 
       [5, 6, 7, 8, 9, 0]]) 

#   a d b e c f 
new_order = [0, 3, 1, 4, 2, 5] 
A1 = A[:, new_order][new_order] 

Dưới đây là một giải pháp Python tinh khiết có thể được chuyển giao cho NumPy:

#  a b c d e f 
A = [[0, 1, 2, 3, 4, 5], 
    [1, 0, 3, 4, 5, 6], 
    [2, 3, 0, 5, 6, 7], 
    [3, 4, 5, 0, 7, 8], 
    [4, 5, 6, 7, 0, 9], 
    [5, 6, 7, 8, 9, 0]] 

#   a d b e c f 
new_order = [0, 3, 1, 4, 2, 5] # maps previous index to new index 
A1 = [[A[i][j] for j in new_order] for i in new_order] 

Kết quả:

>>> pprint.pprint(A1) 
[[0, 3, 1, 4, 2, 5], 
[3, 0, 4, 7, 5, 8], 
[1, 4, 0, 5, 3, 6], 
[4, 7, 5, 0, 6, 9], 
[2, 5, 3, 6, 0, 7], 
[5, 8, 6, 9, 7, 0]] 

Đây là phiên bản mà sửa đổi A tại chỗ:

A[:] = [A[i] for i in new_order] 
for row in A: 
    row[:] = [row[i] for i in new_order] 
+0

Một điều đẹp. Điều đó hoàn thành chính xác những gì tôi đang tìm kiếm và khá nhỏ gọn. Tuy nhiên, tôi không hiểu "pprint.pprint". Ngoài ra, nhận xét của bạn đã làm cho câu trả lời dễ đọc hơn. Là một newb, tôi đánh giá cao nó. – emmagras

+0

@wagras - ['pprint'] (http://docs.python.org/library/pprint.html) là một mô-đun cho dữ liệu" in đẹp ", nó chỉ là một cách đơn giản để in các mảng và từ điển trong đó định dạng hàng/cột, thay vì chỉ trên một dòng. –

+0

@wagras - Trong trường hợp bạn không thấy chỉnh sửa của mình, tôi đã tìm thấy giải pháp ngắn gọn hơn cho NumPy. –

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