2011-07-21 30 views
9

Tôi đang dịch một số nội dung từ MATLAB sang ngôn ngữ Python.Làm cách nào tôi có thể sử dụng duy nhất (a, 'hàng') từ MATLAB bằng Python?

Có lệnh này, duy nhất (a), trong NumPy. Nhưng kể từ khi chương trình MATLAB chạy lệnh 'hàng' cũng có, nó cung cấp cho một cái gì đó một chút khác nhau.

Có một lệnh tương tự trong Python hay tôi nên thực hiện một số thuật toán thực hiện điều tương tự?

+4

bạn đã thấy điều này: http://mail.scipy.org/pipermail/numpy-discussion/2009-August/044664.html – Amro

+0

Tôi đã thấy nó, nhưng không có lệnh unique1d như vậy. Tôi nghĩ rằng họ đã gỡ bỏ nó tại Numpy mới, không chắc chắn tho. –

+4

Thử 'unique' thay vì' unique1d' - ví dụ từ chuỗi đó sẽ hoạt động. – ars

Trả lời

5

Giả sử mảng 2D của bạn được lưu trữ theo thứ tự C thông thường (nghĩa là mỗi hàng được tính là một mảng hoặc danh sách trong mảng chính; hoặc nói cách khác, thứ tự hàng chính) hoặc bạn chuyển mảng trước nếu không, bạn có thể làm điều gì đó như ...

>>> import numpy as np 
>>> a = np.array([[1, 2, 3], [2, 3, 4], [1, 2, 3], [3, 4, 5]]) 
>>> a 
array([[1, 2, 3], 
     [2, 3, 4], 
     [1, 2, 3], 
     [3, 4, 5]]) 
>>> np.array([np.array(x) for x in set(tuple(x) for x in a)]) # or "list(x) for x in set[...]" 
array([[3, 4, 5], 
     [2, 3, 4], 
     [1, 2, 3]]) 

Tất nhiên, điều này không thực sự hiệu quả nếu bạn cần các hàng duy nhất theo thứ tự ban đầu.


Bằng cách này, bắt chước cái gì đó như unique(a, 'columns'), bạn muốn chỉ transpose mảng ban đầu, làm các bước trình bày ở trên, và sau đó transpose lại.

1

Bạn có thể thử:

ii = 0; wrk_arr = your_arr 
idx = numpy.arange(0,len(wrk_arr)) 
while ii<=len(wrk_arr)-1: 
    i_list = numpy.arange(0,len(wrk_arr) 
    candidate = numpy.matrix(wrk_arr[ii,:]) 
    i_dup = numpy.array([0] * len(wrk_arr)) 
    numpy.all(candidate == wrk_arr,axis=1, iout = idup) 
    idup[ii]=0 
    i_list = numpy.unique(i_list * (1-idup)) 
    idx = numpy.unique(idx * (1-idup)) 
    wrk_arr = wrk_arr[i_list,:] 
    ii += 1 

Kết quả là wrk_arr đó là mảng được sắp xếp độc đáo của your_arr. Mối quan hệ là:

your_arr[idx,:] = wrk_arr 

Nó hoạt động như MATLAB theo nghĩa là mảng được trả về (wrk_arr) giữ thứ tự của các mảng ban đầu (your_arr). Mảng idx khác với MATLAB vì nó chứa các chỉ số xuất hiện đầu tiên trong khi MATLAB trả về hình thức LAST.

Từ kinh nghiệm của tôi, nó hoạt động nhanh như MATLAB trên ma trận 10000 X 4.

Và chuyển vị trí sẽ thực hiện thủ thuật cho trường hợp cột.

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