2016-12-26 65 views
1

我正在尋找一種有效的方法來從Python中的數組中提取僅有的重要值,例如只有那些比其他值大10倍的值。使用非常簡單的情況下,邏輯(沒有代碼)是類似的東西:在端new_array從數組中提取重要值

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 = [5000],但必須適用於任何種類數組。

感謝您的幫助!

UPDATE !!!

感謝大家的回答!特別是對科波菲爾給了我一個關於如何去做的好主意。這是用於此目的的代碼!

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'將始終只包含一個值?因爲在你的情況下'400'也應該添加到'new_array'(據我所知)。 – ettanany

+0

首先將'new_array'初始化爲一個空數組,然後'append()'滿足您正在查找的'delta'的任何新項。 –

+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(反向=真)'然後我將通過比較元素來用於進一步分析的第一個元素指定感興趣的子列表。 – 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 

或在pre 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,但我已經成功地快速進入6位數範圍,每個數字只有是它旁邊的9倍(因此,您的規則不會被觸發)。

異常檢測的一種方法是從您的分佈中減去中位數,然後除以反映分佈範圍的非參數統計量(下面我選擇了一個等於標準偏差的分母if數字正常分佈)。這給你一個標準化的「非典型」評分。找到較大的值,並且找到了你的異常值(任何比例大於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