Frage

Was ist ein guter Weg, um sind numerische Werte in einen bestimmten Bereich? Angenommen, ich eine Liste von Werten habe, und ich möchte ist sie in N Bins in ihrem Bereich. Gerade jetzt, ich etwas tun, wie folgt aus:

from scipy import *
num_bins = 3 # number of bins to use
values = # some array of integers...
min_val = min(values) - 1
max_val = max(values) + 1
my_bins = linspace(min_val, max_val, num_bins)
# assign point to my bins
for v in values:
  best_bin = min_index(abs(my_bins - v))

Dabei gilt min_index den Index des minimalen Wert zurückgibt. Die Idee ist, dass man die Behälter finden kann der Punkt in fällt durch Sehen, was ist es die kleinste Differenz hat mit.

Aber ich denke, diese seltsamen Rand Fälle hat. Was ich suche ist eine gute Darstellung von Bins, idealerweise diejenigen, die halb geschlossene halb offen sind (so dass es keine Möglichkeit gibt einen Punkt auf zwei Behälter zuzuweisen), d.

bin1 = [x1, x2)
bin2 = [x2, x3)
bin3 = [x3, x4)
etc...

Was ist ein guter Weg, dies in Python zu tun, mit numpy / scipy? Ich bin nur hier mit Binning Integer-Werte betroffen.

Vielen Dank für Ihre Hilfe.

War es hilfreich?

Lösung

numpy.histogram() tut genau das, was Sie wollen.

Die Funktion Unterschrift lautet:

numpy.histogram(a, bins=10, range=None, normed=False, weights=None, new=None)

Wir sind vor allem in a und bins interessiert. a sind die Eingangsdaten, die binned werden muss. bins kann eine Reihe von Fächern sein (Ihr num_bins), oder es kann eine Folge von Skalare sein, die bin Kanten bezeichnen (halb offen).

import numpy
values = numpy.arange(10, dtype=int)
bins = numpy.arange(-1, 11)
freq, bins = numpy.histogram(values, bins)
# freq is now [0 1 1 1 1 1 1 1 1 1 1]
# bins is unchanged

Um es mit der Dokumentation :

  

Alle aber die letzte (rechte-die meisten) ist halb geöffnet sind. Mit anderen Worten, wenn bins ist:

[1, 2, 3, 4]
     

dann der erste Behälter ist [1, 2) (einschließlich 1, jedoch ohne 2) und die zweiten [2, 3). Die letzte ist, ist jedoch [3, 4], die enthält 4.

Bearbeiten : Sie wollen den Index in Ihre Bins jedes Elements kennen. Dazu können Sie numpy.digitize() verwenden. Wenn Ihr Behälter integral sein werden, können Sie numpy.bincount() auch verwendet werden.

>>> values = numpy.random.randint(0, 20, 10)
>>> values
array([17, 14,  9,  7,  6,  9, 19,  4,  2, 19])
>>> bins = numpy.linspace(-1, 21, 23)
>>> bins
array([ -1.,   0.,   1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,
        10.,  11.,  12.,  13.,  14.,  15.,  16.,  17.,  18.,  19.,  20.,
        21.])
>>> pos = numpy.digitize(values, bins)
>>> pos
array([19, 16, 11,  9,  8, 11, 21,  6,  4, 21])

Da das Intervall auf der oberen Grenze offen ist, sind die Indizes richtig:

>>> (bins[pos-1] == values).all()
True
>>> import sys
>>> for n in range(len(values)):
...     sys.stdout.write("%g <= %g < %g\n"
...             %(bins[pos[n]-1], values[n], bins[pos[n]]))
17 <= 17 < 18
14 <= 14 < 15
9 <= 9 < 10
7 <= 7 < 8
6 <= 6 < 7
9 <= 9 < 10
19 <= 19 < 20
4 <= 4 < 5
2 <= 2 < 3
19 <= 19 < 20

Andere Tipps

Das ist ziemlich einfach in numpy mit Rundfunk - (. Nicht ersten beiden Zeilen zu zählen Bins und Datenpunkte zu schaffen, die von natürlich würde normalerweise geliefert werden) mein Beispiel unter vier Zeilen Code

import numpy as NP
# just creating 5 bins at random, each bin expressed as (x, y, z) although, this code
# is not limited by bin number or bin dimension
bins = NP.random.random_integers(10, 99, 15).reshape(5, 3) 
# creating 30 random data points
data = NP.random.random_integers(10, 99, 90).reshape(30, 3)
# for each data point i want the nearest bin, but before i can generate a distance
# matrix, i need to 'conform' the array dimensions
# 'broadcasting' is an excellent and concise way to do this
bins = bins[:, NP.newaxis, :]
data2 = data[NP.newaxis, :, :]
# now i can calculate the distance matrix
dist_matrix = NP.sqrt(NP.sum((data - bins)**2, axis=-1)) 
bin_assignments = NP.argmin(dist_matrix, axis=0)

‚bin_assignments‘ eine 1D-Array von Indizes, die aus ganzzahligen Werten von 0 bis 4, entsprechend die fünf Bins -. Den Bin-Zuweisungen für jeden der 30 ursprünglichen Punkte in der ‚Daten‘ Matrix über

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top