2017-12-11 118 views
5

Cho một mảng NumPy:Tìm chuyển False-Đúng trong một mảng NumPy

x = np.array([False, True, True, False, False, False, False, False, True, False]) 

Làm thế nào để tìm số lần các giá trị chuyển tiếp từ False True? Đối với ví dụ trên, câu trả lời là 2. I không muốn bao gồm chuyển tiếp từ True thành False trong số lượng.

Từ câu trả lời cho How do I identify sequences of values in a boolean array?, sau đây tạo ra các chỉ mục mà tại đó các giá trị sắp thay đổi, không phải là những gì tôi muốn vì điều này bao gồm chuyển tiếp Đúng-Sai.

np.argwhere(np.diff(x)).squeeze() 
# [0 2 7 8] 

Tôi biết rằng điều này có thể được thực hiện bằng cách lặp qua mảng, tuy nhiên tôi đã tự hỏi liệu có cách nào nhanh hơn để thực hiện việc này không?

Trả lời

8

Lấy các lát một lần - x[:-1] (bắt đầu từ elem đầu tiên và kết thúc trong elem cuối cùng thứ hai) và x[1:] (bắt đầu từ elem thứ hai và tiếp tục cho đến cuối), sau đó tìm slice đầu tiên nhỏ hơn thứ hai, tức là bắt các mô hình của [False, True] và cuối cùng là lấy số liệu với ndarray.sum() hoặc np.count_nonzero() -

(x[:-1] < x[1:]).sum() 
np.count_nonzero(x[:-1] < x[1:]) 

một cách khác sẽ được xem xét cho slice đầu tiên là False và điều thứ hai là True, ý tưởng một lần nữa là tới bắt mẫu đó của [False, True] -

(~x[:-1] & x[1:]).sum() 
np.count_nonzero(~x[:-1] & x[1:]) 
Các vấn đề liên quan