質問
一定の範囲内のビンの数値に良い方法は何ですか?例えば、私は、値のリストを持っていると仮定し、私は彼らの範囲でNビンにビンにそれらをしたいです。今、私はこのような何かをします:
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))
min_indexが最小値のインデックスを返します。アイデアは、あなたがそれを持つ最小の差がどのようなビン見てポイントが該当するビンを見つけることができるということです。
しかし、私は、これは奇妙なエッジケースを持っていると思います。私は何を探していますが、ビンの良い表現であり、半分のある理想的なものは、すなわち、(2つのビンに1ポイントを割り当てる方法がないのでこと)オープン半分閉じます。
bin1 = [x1, x2)
bin2 = [x2, x3)
bin3 = [x3, x4)
etc...
numpyの/ scipyのダウンロードを使用して、Pythonでこれを行うには良い方法は何ですか?私は、整数値のみをビニングとここに関係しています。
非常にご協力いただきありがとうございます。
解決
numpy.histogram()
正確に何をしたいんます。
関数シグネチャである
numpy.histogram(a, bins=10, range=None, normed=False, weights=None, new=None)
私たちはa
とbins
で主に興味を持っています。 a
はビニングする必要のある入力データです。 bins
(ハーフオープン)を表すビンエッジ、ビンの数(あなたのnum_bins
)することができ、またはそれはスカラーの配列であることがことができます。
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
ドキュメントを引用します:
すべてのが、最後の(右側-ほとんどの)ビンは半分開いています。言い換えれば、
bins
がある場合:[1, 2, 3, 4]
は、最初のビン(1を含むが、2を除く)
が含ま[1, 2)
及び第二[2, 3)
あります。最後のビンが、しかし、を[3, 4]
、あるの4ます。
の編集の:あなたは、各要素のあなたのビンのインデックスを知ってほしいです。このために、あなたはnumpy.digitize()
を使用することができます。あなたのビンが不可欠であることを行っている場合は、あなたがうまくとしてnumpy.bincount()
を使用することができます。
>>> 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])
の間隔が上限に開放されているので、インデックスが正しい
>>> (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
他のヒント
これは、放送使用numpyのに非常に簡単であり、 - 以下の私の例では(もちろん通常供給されるビンとデータポイントを作成するために、最初の2行をカウントしない)
コードの4行です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」は5個のビンに対応する、0から4までの整数値からなるインデックスの1Dアレイである - 上記の「データ」行列で30元の点のそれぞれについて、ビンの割り当て