đưa ra một loạt các số nguyên như
[1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5]
Tôi cần phải che dấu các yếu tố lặp lại nhiều N
lần. Để làm rõ: mục tiêu chính là lấy ra mảng mặt nạ boolean, để sử dụng nó sau này để tính toán binning.
Tôi đã đưa ra một giải pháp khá phức tạp
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)
cho ví dụ
bins[mask]
Out[90]: array([1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5])
Có cách nào đẹp hơn để làm điều này?
EDIT, # 2
Cảm ơn rất nhiều cho câu trả lời! Đây là một phiên bản mỏng của cốt truyện chuẩn của MSeifert. Cảm ơn đã chỉ cho tôi simple_benchmark
. Chỉ hiển thị 4 tùy chọn nhanh nhất:
Phần kết luận
Ý tưởng được đề xuất bởi Florian H , được sửa đổi bởi Paul Panzer dường như là một cách tuyệt vời để giải quyết vấn đề này vì nó khá đơn giản và đơn giản numpy
. numba
Tuy nhiên, nếu bạn ổn với việc sử dụng , giải pháp của MSeifert vượt trội so với giải pháp khác.
Tôi đã chọn chấp nhận câu trả lời của MSeifert vì đây là câu trả lời chung chung hơn: Nó xử lý chính xác các mảng tùy ý với các khối (không duy nhất) của các phần tử lặp lại liên tiếp. Trong trường hợp numba
là không nên, câu trả lời của Divakar cũng đáng xem!