5

シリーズと一連のビンを取り、基本的に最も近いビンに切り上げることができる関数が必要です。例えば:

my_series = [ 1, 1.5, 2, 2.3,  2.6,  3]
def my_function(my_series, bins):
    ...

my_function(my_series, bins=[1,2,3])
> [1,2,2,3,3,3]

これは、 Numpy の Digitizeが意図していることに非常に近いようですが、間違った値 (間違った値にはアスタリスク) が生成されます。

np.digitize(my_series, bins= [1,2,3], right=False)
> [1, 1*, 2, 2*, 2*, 3]

それが間違っている理由は、ドキュメントから明らかです。

i が返す各インデックスは、bins が単調増加の場合はbins[i-1] <= x < bins[i] 、bins が単調減少の場合はbins[i-1] > x >= bins[i]となります。x の値がビンの境界を超えている場合、0 または len(bins) が適切に返されます。right が True の場合、インデックス i が bins[i-1] < x <= bins[i] または bins[i-1] >= x > bins[i]``ビンがそれぞれ単調に増加または減少している場合。

値を減らして入力し、「右」をTrueに設定すると、希望するものに少し近づくことができます...

np.digitize(my_series, bins= [3,2,1], right=True)
> [3, 2, 2, 1, 1, 1]

しかし、基本的に最も低い番号の割り当て (1) と最も高い番号の割り当て (3) を逆にする方法を考えなければなりません。ビンが3つしかない場合は簡単ですが、ビンの数が長くなると面倒になります..これをすべて行うには、よりエレガントな方法が必要です。

4

3 に答える 3

3

インデックスを取得し、対応する要素を抽出するために、np.digitizeそのrightオプション セットを使用して、 off 、 Bring inなどのように簡単に使用できます。Truebinsnp.take

np.take(bins,np.digitize(a,bins,right=True))
于 2016-09-08T18:25:46.980 に答える
1

私はnp.searchsortedあなたが望むことをすると信じています:

a対応する要素vがインデックスの前に挿入された場合に a の順序が保持されるように、並べ替えられた配列のインデックスを検索します。

In [1]: my_series = [1, 1.5, 2, 2.3, 2.6, 3]

In [2]: bins = [1,2,3]

In [3]: import numpy as np

In [4]: [bins[k] for k in np.searchsorted(bins, my_series)]
Out[4]: [1, 2, 2, 3, 3, 3]

(numpy 1.10.0 の時点でdigitizeは、 の観点から実装されていsearchsortedます。)

于 2016-09-08T04:42:45.197 に答える
1

別の方法は次のとおりです。

In [25]: def find_nearest(array,value):
    ...:     idx = (np.abs(array-np.ceil(value))).argmin()
    ...:     return array[idx]
    ...: 

In [26]: my_series = np.array([ 1, 1.5, 2, 2.3,  2.6,  3])

In [27]: bins = [1, 2, 3]

In [28]: [find_nearest(bins, x) for x in my_series]
Out[28]: [1, 2, 2, 3, 3, 3]
于 2016-09-08T04:44:52.547 に答える