2016-12-25 12 views
2

浮動小数点値の場合、浮動小数点数の場合はcharmのように機能するサブセット和を計算するためのコードを記述しましたが、結果は得られません。浮動小数点値のサブセットの和が動作しない

コード:整数のため

import numpy as np 
array = np.array([15,1,4,6,3,10,4.2]) 
num = 8.2 

def subsetsum(array,num): 

    if num == 0 or num < 1: 
     return None 
    elif len(array) == 0: 
     return None 
    else: 
     if array[0] == num: 
      return [array[0]] 
     else: 
      with_v = subsetsum(array[1:],(num - array[0])) 
      if with_v: 
       return [array[0]] + with_v 
      else: 
       return subsetsum(array[1:],num) 

print('\nList of Values : ',array) 
print('\nSum Desired : ',num) 
print('\nValues that add up to sum : ',subsetsum(array,num)) 

出力はフロートのため

List of Values : [15 1 4 6 3 10 4] 

Sum Desired : 8 

Values that add up to sum : [1, 4, 3] 

出力が

List of Values : [ 15. 1. 4. 6. 3. 10. 4.2] 

Sum Desired : 8.2 

Values that add up to sum : None 

値値浮動小数点値はどのように処理できますか?

+1

小数点浮動小数点数リテラルは浮動小数点数を正確に表していないため、簡単な答えはありません。 https://docs.python.org/3.6/library/decimal.htmlを試してみてください。また、いくつかの問題に触れる – pvg

+0

私の解決策を達成するために何をする必要がありますか? –

+0

フロートケースにはどのようなo/pがありますか? – Divakar

答えて

2

浮動小数点数の比較を考慮するには、単にnp.iscloseを使用します。したがって、あなたのケースを解決するには、等価比較をarray[0] == numに置き換えます。np.isclose(array[0], num)

同様に、最初に似たような編集を行い、修正する場合は、num == 0とします。

+0

動作はしていますが、出力は[1.0,3.0,4.2000000000002]です。私は[1.0,3.0,4.2]が必要です。それを達成する方法? –

+0

@MukeshKumarMishraは書式設定の問題です。 – pvg

+0

@MukeshKumarMishra '4.2000000000002'は入力の最後の要素です。 16桁の小数点以下をすべて表示するには、 'np.set_printoptions(precision = 16)'を設定して、入力配列を出力します。最後の要素は '4.2000000000002'です。希望は意味をなさない。 o/pとして配列を取得するには、 'np.array(subsetsum(array、num))'を実行します。 – Divakar

0

すべての数値が1より大きいと仮定すると、ターゲットよりも大きな配列内の要素を削除できる場合は、アルゴリズムを高速化できます。

アルゴリズムにいくつかの変更を加えてコードを動作させることができました。

import numpy as np 
z=[] 
def subsetsum(array,tgt): 
    if len(array)==1 and array[0]==tgt: 
     return tgt 
    elif len(array)<=1: 
     return z 
    else: 
     k,s=[],0 
     for i in array: 
      s+=i 
      k.append(i) 
      if s==tgt: 
       z.append([k]) 
       k=[] 
     return subsetsum(array[1:],tgt) 

array = np.array([15,1,4,6,3,10,4.2]) 
num=8.2 
array.sort() #speed up 
array=array[array<=num] #speed up 
print subsetsum(array,num) 
関連する問題