Saya memiliki array numpy dengan beberapa nilai NaN:

arr = [ 0, NaN, 2, NaN, NaN, 5, 6, 7 ]

Menggunakan beberapa logika (di luar cakupan pertanyaan), saya membuat topeng lokasi NaN:

mask = [ True, False, True, False, False, True, True, True ]

Saya menggunakan topeng ini untuk memilih hanya data yang valid:

valid_arr = arr[mask]   # [ 0, 2, 5, 6, 7 ]

Saya kemudian melakukan algoritma arbitrer yang memilih beberapa indeces dalam array baru ini:

indeces = myAlgo(valid_arr)   # [ 1, 3 ]

indeces dalam larik yang valid adalah 1,3 (sesuai dengan nilai 2 dan 6). Saya perlu tahu apa indeces ini sesuai dengan dalam larik asli (arr). Dalam contoh di atas, ini jelas merupakan 2 dan 6.

Array adalah data deret waktu, tidak diurutkan. Salah satu solusinya adalah mengulangi mask, menambah penghitung hanya ketika nomor yang valid ditemukan. Bisakah ini dilakukan lebih efisien menggunakan numpy?

3
David Ferris 17 Agustus 2017, 02:33

2 jawaban

Jawaban Terbaik

Anda dapat meratakan topeng yang mengembalikan indeks dari larik asli, dan kemudian menggunakan indeks baru untuk mensubset indeks topeng:

mask = np.array([ True, False, True, False, False, True, True, True ])
indices = [1,3]

np.flatnonzero(mask)[indices]
# array([2, 6])
3
Psidom 16 Agustus 2017, 23:45

Anda dapat membuat larik indeks (menggunakan np.arange< /a>) lalu tutupi itu dan terakhir gunakan pengindeksan lanjutan menggunakan array integer untuk mendapatkan item yang sesuai:

>>> mask = np.array([ True, False, True, False, False, True, True, True ])
>>> np.arange(mask.size)[mask][[1, 3]]
array([2, 6])
2
MSeifert 16 Agustus 2017, 23:50