2016-12-26 11 views
1

私は、Pythonの配列から有効な値だけを効率的に抽出する方法を探しています。例えば、残りの10倍のような大きな値があります。非常に単純なケースを使用して論理(NOコード)は、そのようなものである:配列から重要な値を抽出する

array = [5000, 400, 40, 10, 1, 35] # here the significant value will be 5000. 

from i=0 to len.array # to run the procedure in all the array components 

    delta = array[i]/array [i+1] # to confirm that array[i] is significant or not. 

    if delta >= 10 : # assuming a rule of 10X significance i.e significance = 10 times bigger than the rest of elements in the array. 

    new_array = array[i] # Insert to new_array the significant value 

    elif delta <= 0.1 : # in this case the second element is the significant. 

    new_array = array[i+1] # Insert to new_array the significant value 

端new_arrayに有意な値で構成され、この場合new_array = [5000]で、任意の種類に適用されなければなりません配列の。

ありがとうございました!

UPDATE !!!

お返事ありがとうございます!特に私にそれをする方法についての良いアイデアをくれたCopperfieldに尋ねた。目的のために働くコードはここにあります!

array_o = [5000,4500,400, 4, 1, 30, 2000] 

array = sorted(array_o) 

new_array = [] 

max_array = max(array) 

new_array.append(max_array) 

array.remove(max_array) 

    for i in range(0,len(array)): 
     delta = max_array/array[i] 
     if delta <= 10: 
       new_array.append(array[i]) 
+1

'new_array'には常に1つの値しか含まれないということですか?あなたのケースでは 'new_array'に' 400'も追加しなければならないからです。 – ettanany

+0

最初に空の配列として 'new_array'を初期化し、探している' delta'を満たす新しい項目を 'append()'します。 –

+3

あなたは '[5001、5000、400、40、10、1、35]'から何を抽出しますか? –

答えて

0

これはあなたの質問にお答えしますか?

maxNum = max(array) 
array.remove(maxNum) 
SecMaxNum = max(array) 

if maxNum/SecMaxNum >= 10 : 
    # take action accordingly 
else: 
    # take action accordingly 
+0

そういうものがありますが、これはすべての種類の配列に適用する必要があります。その理由から、インデックスを使って作業する方がはるかに優れているということです。あなたの例では、5つの重要な値があれば何が起こるでしょうか?ご協力いただきありがとうございます! – FMEZA

+0

私はこの場合、リスト(または配列) 'arr.sort(reverse = True) 'をソートするために行くでしょう、そして、私は、後の分析のために要素を最初の要素と比較することによって関心のあるサブリストを指定します。 – Amjad

0

あなたの擬似コードは

def function(array): 
    new_array = [] 
    for i in range(1,len(array)): 
     delta = array[i-1]/array[i] 
     if delta >= 10: 
      new_array.append(array[i-1]) 
     elif delta <= 0.1: 
      new_array.append( array[i]) 
    return new_array 

この

>>> function([5000, 400, 40, 10, 1, 35]) 
[5000, 400, 10, 35] 
>>> 

は、何を記述pythonで次のように行うことができ、この結果を与えるこの関数に変換することができ3.5+

*rest, secondMax, maxNum = sorted(array) 
if maxNum/secondMax >= 10: 
    # take action accordingly 
else: 
    # take action accordingly 

または前viousバージョン

sortedArray = sorted(array) 
if sortedArray[-1]/sortedArray[-2] >= 10: 
    # take action accordingly 
else: 
    # take action accordingly  

(負の屈折率のアクセス最後の要素が最初に、そう-1などの、最後の、-2秒最後であるため)

0

は私は比較のアプローチを採用しないであろう各値はその隣の値になります。配列がソートされていない場合には、その後、明らかにそれは災害だが、それがソートされている場合でも:その例で

a = [531441, 59049, 6561, 729, 81, 9, 9, 8, 6, 6, 5, 4, 4, 4, 3, 3, 1, 1, 1, 1] 

を、値の「休息」(つまり、大多数は)< 10ですが、私が管理しています各数字がの場合はの9倍になるので、6桁の範囲に入るとすぐにルールが起動されます。

外れ値検出のアプローチの1つは、分布の中央値を差し引き、分布の広がりを反映するノンパラメトリックな統計値で除算することです(以下では、標準偏差と等価な分母を選択しています数字は正規分布していた)。これにより、標準化されたスケールで「非典型的」スコアが得られます。大きな値を見つけたら、異常値を見つけました(たとえば、3より大きいスコアですが、問題に対してうまく機能するカットオフを見つけるために少しでも遊んでください)。

import numpy 
    npstd = numpy.diff(numpy.percentile(a, [16, 84]))/2.0 # non-parametric "standard deviation" equivalent 
    score = (a - numpy.median(a))/npstd 
    outlier_locations, = numpy.where(score > 3) # 3, 4 or 5 might work well as cut-offs 
関連する問題