2015-06-14 14 views
18

Tôi đã tìm kiếm một cách để kiểm tra hiệu quả các bản sao trong một mảng có nhiều mảng và vấp phải một câu hỏi có chứa câu trả lời bằng cách sử dụng mã này.Điều này sẽ làm gì: s [s [1:] == s [: - 1]] làm việc gì?

Dòng này có ý nghĩa gì trong vón cục?

s[s[1:] == s[:-1]] 

Muốn hiểu mã trước khi áp dụng. Nhìn vào tài liệu Numpy nhưng gặp khó khăn trong việc tìm kiếm thông tin này.

Trả lời

20

Các lát [1:][:-1] nghĩa tất cả nhưng đầu tiên và tất cả nhưng yếu tố cuối cùng của mảng:

>>> import numpy as np 
>>> s = np.array((1, 2, 2, 3)) # four element array 
>>> s[1:] 
array([2, 2, 3]) # last three elements 
>>> s[:-1] 
array([1, 2, 2]) # first three elements 

do đó việc so sánh tạo ra một loạt các so sánh boolean giữa mỗi phần tử s[x] và nó "hàng xóm"s[x+1], sẽ ngắn hơn một mảng ban đầu (vì phần tử cuối cùng không có hàng xóm):

>>> s[1:] == s[:-1] 
array([False, True, False], dtype=bool) 

và sử dụng rằng mảng chỉ mục mảng ban đầu được cho bạn những yếu tố mà so sánh là True, tức là các yếu tố đó cũng giống như người hàng xóm của họ:

>>> s[s[1:] == s[:-1]] 
array([2]) 

Lưu ý rằng điều này chỉ xác định liền kề giá trị trùng lặp.

+0

Wow, cảm ơn vì đã giải thích kỹ lưỡng: D. Sẽ chấp nhận càng sớm càng tốt. Vì vậy, tôi đoán để tìm tất cả các dups, sắp xếp và sau đó làm điều này: D. – zehelvion

+0

@zehelvion có, nếu mảng không được phân loại, bạn sẽ cần phải sắp xếp đầu tiên cho phương pháp này để tìm tất cả các bản sao. – jonrsharpe

+0

Không phải mảng sắp xếp yêu cầu phải không? – gabhijit

3

s[1:] == s[:-1] so sánh s mà không có yếu tố đầu tiên với s mà không có yếu tố cuối cùng, ví dụ: 0 với 1, 1 với 2 vv, đem lại cho bạn một loạt các yếu tố len(s) - 1 boolean. s[boolarray] sẽ chỉ chọn những yếu tố đó từ sTrue tại địa điểm tương ứng trong boolarray. Do đó, mã trích xuất tất cả các phần tử bằng với phần tử tiếp theo.

6

Kiểm tra này ra:

>>> s=numpy.array([1,3,5,6,7,7,8,9]) 
>>> s[1:] == s[:-1] 
array([False, False, False, False, True, False, False], dtype=bool) 
>>> s[s[1:] == s[:-1]] 
array([7]) 

Vì vậy s[1:] mang đến cho tất cả các số nhưng là người đầu tiên, và s[:-1] tất cả nhưng cuối cùng. Bây giờ, hãy so sánh hai vectơ này, ví dụ: xem xét hai phần tử lân cận có giống nhau hay không. Cuối cùng, chọn các yếu tố này.

3

Nó sẽ hiển thị các bản sao trong một mảng được sắp xếp.

Về cơ bản, biểu thức bên trong s[1:] == s[:-1] so sánh mảng với phiên bản được dịch chuyển của nó. Hãy tưởng tượng điều này:

1, [2, 3, ... n-1, n ] 
- [1, 2, ... n-2, n-1] n 
=> [F, F, ... F, F ] 

Trong mảng được sắp xếp, sẽ không có True trong mảng kết quả trừ khi bạn đã lặp lại. Sau đó, biểu thức này s[array] lọc những bộ lọc có True trong chỉ mục array.

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