Tìm kiếm trong Numpy
Tôi đã sắp xếp số tăng dần nếu bạn thực hiện abs (arr) trong mã bên dưới, tôi đang cố gắng tìm kiếm chỉ mục trong đó dấu hiệu được thay đổi từ âm sang dương. Đã viết đoạn mã này bên dưới, nhưng vì một số lý do, tôi tin rằng chúng tôi có thể cải thiện nó hoặc tối ưu hóa nhiều hơn. Bất kỳ mẹo và thủ thuật?
import numpy as np
arr = np.array([-1,-2,-3, 4, 5, 6])
_cut_index_1 = np.where(arr > 0)[0][0]
_cut_index_2 = np.where(arr < 0)[0][-1]
arr[_cut_index_1] # output: 4
arr[_cut_index_2] # output: -3
Trả lời
Giải pháp hiện tại của bạn thực hiện hai lần vượt qua mảng đầu vào (hai lệnh gọi của np.where) như đã nêu có vẻ lãng phí. Một cách đơn giản để giải quyết vấn đề là sử dụng cách np.argmaxnày sẽ mất thời gian tuyến tính:
import numpy as np
arr = np.array([-1, -2, -3, 4, 5, 6])
np.argmax(arr > 0) # Return (index) 3
Tại thời điểm này, nếu chúng tôi có thể giả định (như bạn có vẻ ngụ ý) rằng có một vị trí quan tâm duy nhất (và / hoặc chúng tôi chỉ quan tâm đến vị trí đầu tiên, đọc từ trái sang phải) thì chúng tôi đã hoàn thành: chỉ giảm một từ câu trả lời và bạn có điểm giới hạn khác (nhưng hãy kiểm tra xem chúng tôi có đang ở trong trường hợp góc cạnh để không trả về chỉ mục không hợp lệ hay không).
Nhưng trên thực tế, nếu bạn có thể giả định một cách an toàn rằng đầu vào đã được sắp xếp, bạn có thể tránh thực hiện quét tuyến tính và thậm chí không đọc toàn bộ đầu vào. Đối với điều này, bạn có thể thực hiện tìm kiếm nhị phân thông qua tìm kiếm được phân loại . Về mặt lý thuyết, điều này nhanh hơn (ví dụ: logarit so với tuyến tính trong trường hợp xấu nhất) nhưng trên thực tế, điều này sẽ phụ thuộc vào kích thước của mảng. Nghĩa là, đối với các mảng đủ nhỏ, quá trình quét tuyến tính sẽ nhanh hơn do vị trí bộ nhớ cache (hoặc ít nhất, đó phải là trường hợp mô-đun chi tiết phần cứng của bạn).