Ruby配列関数に相当するNumpy

コンペドール

私はデータの前処理、この場合は等幅のビニングを練習するための割り当てに取り組んでいますが、これらのnumpy関数に精通していないため、Pythonコードはちょっと醜いです:

def eq_width_bin(data, bins):
  bin_edge = np.linspace(np.min(data), np.max(data), bins+1)
  bin_edge[-1] += 1
  re  = []
  for i in data:
    for j in bin_edge:
      if i < j:
        re.append(int(np.argwhere(bin_edge==j))-1)
        break
  return re

data = np.array([80, 95, 70, 30, 20, 10, 75, 65, 98, 103, 130, 70])
print("After equal width binning:\n{}".format(eq_width_bin(data, 3)))

ただし、ルビーでは10行未満で実行できます(これは少し遅いという事実にもかかわらず):

def eq_width_bin(data, bins)
  bin_edge = bins.times.collect{|i| data.min + (data.max - data.min) / bins * i} << data.max + 1
  return data.collect{|i| bin_edge.index{|j| i < j} - 1}
end
data = [80, 95, 70, 30, 20, 10, 75, 65, 98, 103, 130, 70]
puts "After equal width binning:\n#{eq_width_bin(data, 3)}"

私はよく.select .collect .inject .sort_byrubyで配列を扱うことに慣れているので、上記のPythonコードを「美化」するために使用できるnumpy関数はありますか?(特に、numpyの組み込み関数がpyhtonで実行するよりもはるかに高速であることを知っています)

hpaulj

以下のように最初はこれが見えたbincounthistogramが、出力は各値はフィットではなく、ビン当たりの項目数のビンです。

In [3]: eq_width_bin(data,3)                                                    
Out[3]: [1, 2, 1, 0, 0, 0, 1, 1, 2, 2, 2, 1]

あなたのゴミ箱:

In [10]: np.linspace(np.min(data),np.max(data),4)                               
Out[10]: array([ 10.,  50.,  90., 130.])

単純な整数除算で各値のビンを識別できます。

In [12]: (data-10)//40                                                          
Out[12]: array([1, 2, 1, 0, 0, 0, 1, 1, 2, 2, 3, 1])

そして、その3を次のように修正します。

In [16]: np.minimum((data-10)//40,2)                                            
Out[16]: array([1, 2, 1, 0, 0, 0, 1, 1, 2, 2, 2, 1])

しかし、それはあなたの質問に答えません.select .collect .inject .sort_by手に負えない私はそれらに精通していません(私はSqueak何年も前のファンRuby、少し手を出していましたが)。それらは、で収集されたものなど、イテレータのように聞こえますitertools

ではnumpy、私たちは通常、反復的なアプローチを取ることはありません。むしろ、配列全体を調べて、除算や最小/最大などを実行します。

===

searchsorted この問題でも機能します。

In [19]: np.searchsorted(Out[10],data)                                              
Out[19]: array([2, 3, 2, 1, 1, 0, 2, 2, 3, 3, 3, 2])

In [21]: np.maximum(0,np.searchsorted(Out[10],data)-1)                              
Out[21]: array([1, 2, 1, 0, 0, 0, 1, 1, 2, 2, 2, 1])

Pythonループの(おそらく)よりクリーンな表現:

def foo(i, edges):
    for j,n in enumerate(edges):
        if i<n:
            return j-1
    return j-1
In [34]: edges = np.linspace(np.min(data),np.max(data),4).tolist()              
In [35]: [foo(i,edges) for i in data]                                           
Out[35]: [1, 2, 1, 0, 0, 0, 1, 1, 2, 2, 2, 1]

edgesリストに変換したのは、そのように繰り返す方が速いからです。

itertools

In [55]: [len(list(itertools.takewhile(lambda x: x<i,edges)))-1 for i in data]  
Out[55]: [1, 2, 1, 0, 0, -1, 1, 1, 2, 2, 2, 1]

===

別のアプローチ

In [45]: edges = np.linspace(np.min(data),np.max(data),4)                       
In [46]: data[:,None]<-edges                                                    
Out[46]: 
array([[False, False, False, False],
       [False, False, False, False],
       [False, False, False, False],
       [False, False, False, False],
       [False, False, False, False],
       [False, False, False, False],
       [False, False, False, False],
       [False, False, False, False],
       [False, False, False, False],
       [False, False, False, False],
       [False, False, False, False],
       [False, False, False, False]])
In [47]: np.argmax(data[:,None]<edges, axis=1)-1                                
Out[47]: array([ 1,  2,  1,  0,  0,  0,  1,  1,  2,  2, -1,  1])

それに-1はクリーニングが必要です(Trueがない行)。

編集

リストにはindexメソッドがあります。これで、最後のRuby行によく似た式を取得できますリスト内包表記はRubyによく似ているようcollectです。

In [88]: [[i<j for i in edges].index(False)-1 for j in data]                    
Out[88]: [1, 2, 1, 0, 0, -1, 1, 1, 2, 2, 2, 1]

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

numpy.where()関数に相当するFortran?

分類Dev

配列をruby関数に渡す

分類Dev

Ruby-関数内から配列にアクセスする

分類Dev

Ruby-関数内から配列にアクセスする

分類Dev

NumPy配列の各行(行単位)に関数を適用する

分類Dev

numpy配列に沿って関数を適用する

分類Dev

Pythonのnumpy配列に関数を適用する

分類Dev

Python関数でNumPy配列に要素を追加する方法

分類Dev

Numpy:配列に対する関数の割り当てと評価

分類Dev

numpyのwhere関数に相当するJuliaとは何ですか?

分類Dev

Rubyの配列に関する問題

分類Dev

MATLABのスパース関数に相当するnumpy / scipy

分類Dev

Tensorflowのembedding_lookup関数に相当するNumpy

分類Dev

Pythonでnumpy.ones関数とnumpy.zeros関数を1つの配列に連結する方法は?

分類Dev

1x2linspace配列に相当するnumpyを作成する方法

分類Dev

numpy配列のすべての要素に条件関数を適用する

分類Dev

numpy:配列のすべての行に関数を適用する方法

分類Dev

rubyは配列を関数の引数に変換します

分類Dev

マスクされたnumpy配列に関数を適用する

分類Dev

numpyの2つの配列に依存する関数のベクトル化

分類Dev

numpy配列の要素に関数を適用する効率的な方法は?

分類Dev

Ruby on Rails:文字列配列をhighchart関数に渡す

分類Dev

Ruby配列ブロックのインスタンス化に相当するPython?

分類Dev

トーチのfrom_numpyに相当するkeras関数は何ですか?

分類Dev

関数を配列に格納する

分類Dev

ロールされた 2D 配列を持つ zip に相当する Numpy

分類Dev

JavaScript unescape関数に相当するJava

分類Dev

iif関数に相当するJava

分類Dev

COUNTIF集計関数に相当するSQLServer

Related 関連記事

  1. 1

    numpy.where()関数に相当するFortran?

  2. 2

    配列をruby関数に渡す

  3. 3

    Ruby-関数内から配列にアクセスする

  4. 4

    Ruby-関数内から配列にアクセスする

  5. 5

    NumPy配列の各行(行単位)に関数を適用する

  6. 6

    numpy配列に沿って関数を適用する

  7. 7

    Pythonのnumpy配列に関数を適用する

  8. 8

    Python関数でNumPy配列に要素を追加する方法

  9. 9

    Numpy:配列に対する関数の割り当てと評価

  10. 10

    numpyのwhere関数に相当するJuliaとは何ですか?

  11. 11

    Rubyの配列に関する問題

  12. 12

    MATLABのスパース関数に相当するnumpy / scipy

  13. 13

    Tensorflowのembedding_lookup関数に相当するNumpy

  14. 14

    Pythonでnumpy.ones関数とnumpy.zeros関数を1つの配列に連結する方法は?

  15. 15

    1x2linspace配列に相当するnumpyを作成する方法

  16. 16

    numpy配列のすべての要素に条件関数を適用する

  17. 17

    numpy:配列のすべての行に関数を適用する方法

  18. 18

    rubyは配列を関数の引数に変換します

  19. 19

    マスクされたnumpy配列に関数を適用する

  20. 20

    numpyの2つの配列に依存する関数のベクトル化

  21. 21

    numpy配列の要素に関数を適用する効率的な方法は?

  22. 22

    Ruby on Rails:文字列配列をhighchart関数に渡す

  23. 23

    Ruby配列ブロックのインスタンス化に相当するPython?

  24. 24

    トーチのfrom_numpyに相当するkeras関数は何ですか?

  25. 25

    関数を配列に格納する

  26. 26

    ロールされた 2D 配列を持つ zip に相当する Numpy

  27. 27

    JavaScript unescape関数に相当するJava

  28. 28

    iif関数に相当するJava

  29. 29

    COUNTIF集計関数に相当するSQLServer

ホットタグ

アーカイブ