149 votes

binning de données en python avec scipy/numpy

J'ai un tableau de nombres et un tableau correspondant aux positions de début et de fin de bac dans ce tableau, et je veux juste prendre la moyenne dans ces bacs ? J'ai un code qui le fait ci-dessous mais je me demande comment le réduire et l'améliorer. merci.

from scipy import *
from numpy import *

def get_bin_mean(a, b_start, b_end):
    ind_upper = nonzero(a >= b_start)[0]
    a_upper = a[ind_upper]
    a_range = a_upper[nonzero(a_upper < b_end)[0]]
    mean_val = mean(a_range)
    return mean_val

data = rand(100)
bins = linspace(0, 1, 10)
binned_data = []

n = 0
for n in range(0, len(bins)-1):
    b_start = bins[n]
    b_end = bins[n+1]
    binned_data.append(get_bin_mean(data, b_start, b_end))

print binned_data

2voto

kostas Points 712

Une autre alternative consiste à utiliser la méthode ufunc.at. Cette méthode applique in-place une opération souhaitée à des indices spécifiés. Nous pouvons obtenir la position de la case pour chaque point de données en utilisant la méthode searchsorted. Ensuite, nous pouvons utiliser at pour incrémenter de 1 la position de l'histogramme à l'indice donné par bin_indexes, chaque fois que nous rencontrons un indice à bin_indexes.

np.random.seed(1)
data = np.random.random(100) * 100
bins = np.linspace(0, 100, 10)

histogram = np.zeros_like(bins)

bin_indexes = np.searchsorted(bins, data)
np.add.at(histogram, bin_indexes, 1)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X