diberi array bilangan bulat seperti
[1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5]
Saya perlu menutupi elemen yang berulang N
kali. Untuk memperjelas: tujuan utama adalah untuk mengambil array topeng boolean, untuk menggunakannya nanti untuk perhitungan binning.
Saya datang dengan solusi yang agak rumit
import numpy as np
bins = np.array([1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5])
N = 3
splits = np.split(bins, np.where(np.diff(bins) != 0)[0]+1)
mask = []
for s in splits:
if s.shape[0] <= N:
mask.append(np.ones(s.shape[0]).astype(np.bool_))
else:
mask.append(np.append(np.ones(N), np.zeros(s.shape[0]-N)).astype(np.bool_))
mask = np.concatenate(mask)
memberi misalnya
bins[mask]
Out[90]: array([1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5])
Apakah ada cara yang lebih baik untuk melakukan ini?
EDIT, # 2
Terima kasih banyak atas jawabannya! Berikut ini adalah versi ramping dari plot benchmark MSeifert. Terima kasih telah menunjuk saya simple_benchmark
. Hanya menampilkan 4 opsi tercepat:
Kesimpulan
Gagasan yang diajukan oleh Florian H , yang dimodifikasi oleh Paul Panzer tampaknya merupakan cara yang bagus untuk menyelesaikan masalah ini karena cukup lurus ke depan dan numpy
- hanya. Jika Anda baik-baik saja dengan menggunakan numba
, solusi MSeifert mengungguli yang lain.
Saya memilih untuk menerima jawaban MSeifert sebagai solusi karena ini adalah jawaban yang lebih umum: Ia dengan benar menangani array sewenang-wenang dengan blok (non-unik) elemen berulang berulang. Dalam hal numba
ini adalah no-go, jawaban Divakar juga patut dilihat!