从数组中提取重要值
问题描述:
我正在寻找一种有效的方法来从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])
答
这是回答您的问题吗?
maxNum = max(array)
array.remove(maxNum)
SecMaxNum = max(array)
if maxNum/SecMaxNum >= 10 :
# take action accordingly
else:
# take action accordingly
答
你的伪代码可以被转换成该功能
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倒数第二个,等等)
答
我不会采取的只是比较方法每个值都在旁边。如果阵列未排序话,显然这是一个灾难,但即使是排序:
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
这是否意味着'new_array'将始终只包含一个值?因为在你的情况下'400'也应该添加到'new_array'(据我所知)。 – ettanany
首先将'new_array'初始化为一个空数组,然后'append()'满足您正在查找的'delta'的任何新项。 –
你会从'[5001,5000,400,40,10,1,35]'中提取什么? –