2012-06-28 64 views
5

Hàm argsort() trả về ma trận các chỉ mục có thể được sử dụng để lập chỉ mục mảng ban đầu để kết quả khớp với kết quả sort().numpy: áp dụng argsort vào mảng

Có cách nào để áp dụng các chỉ mục đó không? Tôi có hai mảng, một là mảng được sử dụng để có được thứ tự sắp xếp, và một là một số dữ liệu liên quan.

Tôi muốn tính assoc_data[array1.argsort()] nhưng điều đó dường như không hoạt động.

Dưới đây là một ví dụ:

z=array([1,2,3,4,5,6,7]) 
z2=array([z,z*z-7]) 
i=z2.argsort() 

z2=array([[ 1, 2, 3, 4, 5, 6, 7], 
      [-6, -3, 2, 9, 18, 29, 42]]) 
i =array([[1, 1, 1, 0, 0, 0, 0], 
      [0, 0, 0, 1, 1, 1, 1]]) 

Tôi muốn áp dụng i để Z2 (hoặc một mảng với các dữ liệu liên quan) nhưng tôi không chắc chắn làm thế nào để làm như vậy.

+0

Bạn muốn sắp xếp trục nào? – user545424

Trả lời

7

Đây có lẽ là quá mức cần thiết, nhưng điều này sẽ làm việc trong trường hợp thứ hai:

import numpy as np 
axis = 0 
index = list(np.ix_(*[np.arange(i) for i in z2.shape])) 
index[axis] = z2.argsort(axis) 
z2[index] 

# Or if you only need the 3d case you can use np.ogrid. 

axis = 0 
index = np.ogrid[:z2.shape[0], :z2.shape[1], :z2.shape[2]] 
index[axis] = z2.argsort(axis) 
z2[index] 
+4

kỳ quặc đủ Tôi cần điều này một lần nữa chính xác một năm sau đó, và trong việc tìm kiếm làm thế nào để làm điều đó, tôi chạy qua câu hỏi tôi hỏi trước .... Cuối cùng tôi hiểu những gì này. Nó không giống như quá mức, btw. –

0

Aha, đã tìm ra.

In [274]: z2[i,range(z2.shape[1])] 
Out[274]: 
array([[-6, -3, 2, 4, 5, 6, 7], 
     [ 1, 2, 3, 9, 18, 29, 42]]) 
+1

Argh - tính năng này hoạt động cho 2D chứ không phải 3D. thở dài. –

+0

Plus bạn đã không nói những gì tôi đã được;) – tiho

+0

um .... vâng tôi đã nói những gì 'i' là; Đọc câu hỏi. –

4

Bạn may mắn, tôi chỉ nhận được bằng thạc sĩ của tôi trong numpyology.

>>> def apply_argsort(a, axis=-1): 
...  i = list(np.ogrid[[slice(x) for x in a.shape]]) 
...  i[axis] = a.argsort(axis) 
...  return a[i] 
... 
>>> a = np.array([[1,2,3,4,5,6,7],[-6,-3,2,9,18,29,42]]) 
>>> apply_argsort(a,0) 
array([[-6, -3, 2, 4, 5, 6, 7], 
     [ 1, 2, 3, 9, 18, 29, 42]]) 

Đối với một lời giải thích về những gì đang xảy ra, xem câu trả lời của tôi để this question.

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