从数组中提取重要值

时间:2016-12-26 16:34:40

标签: python arrays indexing

我正在寻找一种有效的方法来从Python中的数组中提取唯一的值,例如,只有那些比其余值大10倍的值。使用一个非常简单的案例的逻辑(没有代码)是这样的:

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 !!!

感谢大家的答案!特别是科波菲尔给了我一个如何做的好主意。这是为此目的而工作的代码!

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])

3 个答案:

答案 0 :(得分:0)

这会回答你的问题吗?

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

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

答案 1 :(得分: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 

或以前的版本

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

(负索引从最后到第一个访问元素,所以-1是最后一个,-2是最后一个,等等)

答案 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倍(因此,你的规则不会被触发)。

异常值检测的一种方法是从您的分布中减去中位数,并除以反映分布扩散的非参数统计量(下面,我选择的分母等于标准偏差,如果数字通常是分布的)。这为您提供了标准化规模的“非典型”分数。找到大值,你已经找到了你的异常值(任何分数大于,比方说,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