Mencari di Numpy

Oct 01 2020

Saya telah mengurutkan angka naik jika Anda melakukan abs (arr) di kode di bawah ini, saya mencoba mencari indeks di mana tanda diubah dari negatif menjadi positif. Tuliskan kode di bawah ini, tetapi untuk beberapa alasan, saya yakin kami dapat meningkatkan atau mengoptimalkan lebih banyak. Ada tips dan trik?

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

Jawaban

4 Juho Oct 03 2020 at 00:45

Solusi Anda saat ini tidak melewati dua larik input (dua pemanggilan np.where) yang seperti yang dinyatakan tampaknya sia-sia. Salah satu cara sederhana untuk menyelesaikan masalah ini adalah dengan menggunakan np.argmaxyang membutuhkan waktu linier:

import numpy as np
arr = np.array([-1, -2, -3, 4, 5, 6])
np.argmax(arr > 0) # Return (index) 3

Pada titik ini, jika kita dapat berasumsi (seperti yang tampaknya Anda maksudkan) bahwa ada satu posisi yang diminati (dan / atau bahwa kita hanya peduli tentang yang pertama, baca dari kiri ke kanan) kita selesai: cukup kurangi satu dari jawabannya dan Anda memiliki titik potong lainnya (tetapi periksa apakah kami berada di kasus sudut agar tidak mengembalikan indeks yang tidak valid).

Namun pada kenyataannya, jika Anda dapat dengan aman mengasumsikan bahwa input telah diurutkan, Anda dapat menghindari melakukan pemindaian linier dan bahkan tidak membaca seluruh input. Untuk ini, Anda dapat melakukan pencarian biner melalui searchsorted . Secara teoritis, ini lebih cepat (yaitu, logaritmik vs. linier dalam kasus terburuk) tetapi dalam praktiknya ini akan bergantung pada ukuran array. Artinya, untuk array yang cukup kecil, pemindaian linier akan lebih cepat karena lokalitas cache (atau, setidaknya, itulah kasus modulo detail perangkat keras Anda).