Pergunta

Qual é uma boa maneira de agrupar valores numéricos em um determinado intervalo?Por exemplo, suponha que eu tenha uma lista de valores e queira agrupá-los em N compartimentos de acordo com seu intervalo.No momento, eu faço algo assim:

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))

onde min_index retorna o índice do valor mínimo.A ideia é que você possa encontrar a caixa em que o ponto se enquadra, vendo em qual caixa ele tem a menor diferença.

Mas acho que isso tem casos extremos estranhos.O que procuro é uma boa representação de caixas, de preferência aquelas que estão meio fechadas e meio abertas (de modo que não haja como atribuir um ponto a duas caixas), ou seja,

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

qual é uma boa maneira de fazer isso em Python, usando numpy/scipy?Estou preocupado aqui apenas com o agrupamento de valores inteiros.

muito obrigado pela sua ajuda.

Foi útil?

Solução

numpy.histogram() faz exatamente o que você quer.

A assinatura da função é:

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

Estamos principalmente interessados ​​em a e bins. a são os dados de entrada que precisam ser armazenados. bins pode haver vários compartimentos (seu num_bins), ou pode ser uma sequência de escalares, que denotam arestas de bin (semi-abertas).

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

Para citar o documentação:

Todos, exceto o último compartimento (mais à direita), estão entreabertos.Em outras palavras, se bins é:

[1, 2, 3, 4]

então a primeira caixa é [1, 2) (incluindo 1, mas excluindo 2) e o segundo [2, 3).A última caixa, no entanto, é [3, 4], qual inclui 4.

Editar:Você deseja saber o índice em seus compartimentos de cada elemento.Para isso, você pode usar numpy.digitize().Se suas caixas forem integrais, você pode usar numpy.bincount() também.

>>> 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])

Como o intervalo está aberto no limite superior, os índices estão corretos:

>>> (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

Outras dicas

O designer não aparece para todos os arquivos que contêm classes gtk #, só aparece para aqueles que foram criados com o Suporte de Designer - a "janela", "widget" e "diálogo" modelos.

Estes modelos estão disponíveis se o seu projeto referencia o gtk # - mas a maneira mais fácil é criar um novo projeto de aplicativo GTK #, que tem as referências corretas, a placa de inicialização de inicialização do aplicativo e uma classe de janela de designer (MainWindow.cs).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top