2011-11-16 44 views
5

tôi có một danh sáchSắp xếp một mảng NumPy như một bảng

[[0, 3], [5, 1], [2, 1], [4, 5]] 

mà tôi đã làm thành một mảng sử dụng numpy.array:

[[0 3] 
[5 1] 
[2 1] 
[4 5]] 

Làm thế nào để sắp xếp này giống như một bảng? Đặc biệt, tôi muốn sắp xếp theo cột thứ hai theo thứ tự tăng dần và sau đó giải quyết bất kỳ mối quan hệ nào bằng cách có cột đầu tiên được sắp xếp theo thứ tự tăng dần. Do đó, tôi mong muốn:

[[2 1] 
[5 1] 
[0 3] 
[4 5]] 

Mọi trợ giúp sẽ được đánh giá cao!

Trả lời

7

Xem http://docs.scipy.org/doc/numpy/reference/generated/numpy.lexsort.html#numpy.lexsort

Cụ thể trong trường hợp của bạn,

import numpy as np 
x = np.array([[0,3],[5,1],[2,1],[4,5]]) 
x[np.lexsort((x[:,0],x[:,1]))] 

đầu ra

array([[2,1],[5,1],[0,3],[4,5]]) 
+0

Xin chào, cảm ơn vì giải pháp. Tôi thích điều này là tốt nhất vì nó cho tôi thấy rằng bằng cách thay thế x [:, 0] bằng x [:: - 1,0], tôi có thể đảo ngược hướng của phân loại thứ hai (của cột đầu tiên). Rất cám ơn tất cả! – Derek

4

Bạn có thể sử dụng numpy.lexsort():

>>> a = numpy.array([[0, 3], [5, 1], [2, 1], [4, 5]]) 
>>> a[numpy.lexsort(a.T)] 
array([[2, 1], 
     [5, 1], 
     [0, 3], 
     [4, 5]]) 
2

Một cách Nother làm điều này - cắt ra các bit dữ liệu mà bạn muốn, có được các chỉ số loại sử dụng argsort, sau đó sử dụng kết quả đó để cắt mảng ban đầu của bạn:

a = np.array([[0, 3], [5, 1], [2, 1], [4, 5]]) 

subarray = a[:,1] # 3,1,1,5 

indices = np.argsort(subarray) # Returns array([1,2,0,3]) 

result = a[indices] 

Hoặc, tất cả trong một bước:

a[np.argsort(a[:,1])] 
+2

Điều này không sắp xếp các mối quan hệ nhất thiết (cột thứ nhất theo thứ tự tăng dần). – Bruno

+0

True - lexsort trông giống như một lựa chọn tốt hơn ở đây – FredL

1

Nếu bạn muốn sắp xếp sử dụng một cột duy nhất chỉ (ví dụ, cột thứ hai), bạn có thể làm điều gì đó như:

from operator import itemgetter 
a = [[0, 3], [5, 1], [2, 1], [4, 5]] 
a_sorted = sorted(a, key=itemgetter(1)) 

Nếu có nhiều hơn một chìa khóa, sau đó sử dụng numpy.lexsort() như được chỉ ra trong th e câu trả lời khác.

+0

Cảm ơn bạn, đối với trường hợp của tôi 'numpy.array (được sắp xếp (a, key = itemgetter (1)))' làm việc hoàn hảo vẫn là lựa chọn dễ đọc nhất. – firegurafiku

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