Numpy içinde aranıyor
Aşağıdaki kodda abs (arr) yaparsanız artan sayıyı sıraladım, işaretin negatiften pozitife değiştiği indeksi aramaya çalışıyorum. Aşağıdaki kodu yazdım, ancak bazı nedenlerden dolayı onu iyileştirebileceğimize veya daha fazla optimize edebileceğimize inanıyorum. Herhangi bir ipucu ve püf noktası var mı?
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
Yanıtlar
Mevcut çözümünüz, np.wherebelirtildiği gibi israf gibi görünen giriş dizisi (iki çağrısı ) üzerinden iki geçiş yapıyor . Sorunu çözmenin basit bir yolu, np.argmaxdoğrusal zaman alacak olanı kullanmaktır :
import numpy as np
arr = np.array([-1, -2, -3, 4, 5, 6])
np.argmax(arr > 0) # Return (index) 3
Bu noktada, (sizin ima ettiğiniz gibi) tek bir ilgi alanı olduğunu varsayabilirsek (ve / veya yalnızca ilkini önemsediğimizi, soldan sağa okuyun) işimiz biter: cevap ve diğer kesme noktasına sahipsiniz (ancak geçerli olmayan bir indeks döndürmemek için köşede olup olmadığımızı kontrol edin).
Ama aslında, girdinin sıralandığını güvenle varsayabilirseniz, doğrusal bir tarama yapmaktan kaçınabilir ve hatta tüm girdiyi bile okuyamazsınız. Bunun için, sıralı arama yoluyla ikili arama yapabilirsiniz . Teorik olarak, bu daha hızlıdır (yani, en kötü durumda logaritmik ve doğrusal), ancak pratikte bu, dizinin boyutuna bağlı olacaktır. Yani, yeterince küçük diziler için, önbellek yerelliği nedeniyle doğrusal bir tarama daha hızlı olacaktır (veya en azından, donanım ayrıntılarınızı modulo durumunda olması gerekir).