麻烦的迭代数组以平均3个数字的组,并与其他3个数字的组进行比较

时间:2019-05-29 22:23:13

标签: python-3.x iteration

我有12个数字组成的数组。我正在尝试创建一个将前三个取平均值的循环。然后比较是否小于接下来的三个和之后的三个,依此类推。

我已经尝试过elif,但是要说明的条件太多了

result
   date zone_a zone_b zone_c
1 11:00      1      4      0
2 12:00      2      0      0
3 13:00      3      5      6
4 15:00      0      0      7

这是我如何防止IndexError:索引12超出轴12尺寸12的范围

import numpy as np
import math
array = [1,2,3,4,5,6,7,8,9,10,11,12]
for k in range(len(array)):
    target1 = array[k]
    target2 = array [k-1]
    if k<11:
        target3 = array[k+1]
    else:
        target3 = array[0]

我想将目标与(k + 2,k + 3,k + 4)和(k + 5,k + 6,k + 7)和(k + 8,k + 9,k)的平均值进行比较+10)

    targets = [target1, target2, target3]
    target = np.mean(targets)

我无法根据我要比较的数组的其他三个区域的总和来弄清楚如何获取avg的值

我正在考虑这样做

    sigma = 1
    if ((target-avg)/(math.sqrt(target))>= sigma:
        print(array[k])

但条件太多,无法有效编码

1 个答案:

答案 0 :(得分:0)

首先,定义平均值函数,该函数计算可迭代对象中值的平均值:

def average(iterable):
    sum = 0
    for number in iterable:
        sum += number
    return sum / len(iterable)

此功能非常简单。它定义了一个名为“ sum”的变量,并将其初始值设置为0。然后遍历参数“ iterable”,将每个元素的值加到iterable参数中求和。然后,将所有值的总和(变量sum)除以iterable的长度。它以浮点数形式返回结果。

一个例子:该函数被调用。可迭代参数被分配给列表[25、75,-100、20]。将sum变量初始化为0。通过在iterable上循环,将25、75,-100和20相加。总和最终为20。按照Python的len()方法,可迭代的长度为4。20/4 = 5.0(浮点数,因为Python中的一个斜线始终代表真除法,即使结果仍然保留,也返回浮点数强制转换为int后相同。使用两个斜杠进行整数除法),因此该方法返回5.0。

返回您的程序。我认为,在比较它们之前,您应该获得所有平均值。定义平均值列表,如下所示。

averages = []

非常简单。将全局变量“平均值”设置为空列表。

因为您需要每三个数字的平均值,所以应该使迭代范围的步长为3,而不是1。此操作如下。

for counter in range(0, len(array), 3):

范围构造函数最多接受三个参数(开始,停止,步骤)。当它包含三个参数时,它将从“开始”开始计数,以“步进”开始计数,并在“停止”处停止。它记录了一个不变的可迭代对象中计数的每个数字。当包含两个参数时,“ step”设置为1。当包含一个参数时,“ start”设置为0,“ stop”设置为参数,“ step”设置为1。

然后,您要将所有平均值附加到列表“平均值”中。操作如下。

    averages.append(average(array[counter: counter+3: 1]))

列表的“ append”方法将其采用的参数添加到列表的末尾。 [counter:counter + 3:1]是切片索引。 slice构造函数与range相似,但可以使用以下格式来完成:start:stop [:step]且不可迭代,而是从可迭代对象中获取多个元素,并且这些索引由参数确定。值的平均值记录在平均值数组中。

您现在已获得所有平均值。无需担心IndexError,因为切片会忽略任何超出范围的索引而不会引发异常。

接下来,我们要比较平均值。这是代码:

for i in range(0, len(averages)):
    for j in range(0, len(averages)):
        if i == j:
            #Avoid duplicate averages.
            continue
        if averages[i] < averages[j]:
            #averages[i] < averages[j]. 
            #Do something
            continue
        elif averages[i] == averages[j]:
            #averages[i] == averages[j]. 
            #Do something
            continue
        else:
            #averages[i] > averages[j]. Only possibility left. 
            #Do something
            continue

就是这样。我们对平均值而不是平均值本身进行迭代,以测试重复项。如果索引彼此相等,那么我们将继续循环,因为我们不想处理它们。否则,我们将averages [i]与averages [j]比较,并根据条件执行python语句。您没有指定要执行的操作,所以我只是将它们当作重复项来处理,尽管您不应该这样做。其余代码不言自明。

现在,获取完整代码。没有评论:

def average(iterable):
    sum = 0
    for number in iterable:
        sum += number
    return sum / len(iterable)

#Same old array that you mentioned in your question
array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

averages = []

for counter in range(0, len(array), 3):
    averages.append(average(array[counter: counter+3: 1]))

for i in range(0, len(averages)):
    for j in range(0, len(averages)):
        if i == j:
            #Avoid duplicate averages.
            continue
        if averages[i] < averages[j]:
            #averages[i] < averages[j]. 
            #Do something
            continue
        elif averages[i] == averages[j]:
            #averages[i] == averages[j]. 
            #Do something
            continue
        else:
            #averages[i] > averages[j]. Only possibility left. 
            #Do something
            continue

我通过用此代码在两个不同的平均值之间打印结果来测试我的代码。

def average(iterable):
    sum = 0
    for number in iterable:
        sum += number
    return sum / len(iterable)

#Same old array that you mentioned in your question
array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

averages = []

for counter in range(0, len(array), 3):
    averages.append(average(array[counter: counter+3: 1]))

for i in range(0, len(averages)):
    for j in range(0, len(averages)):
        if i == j:
            #Avoid duplicate averages.
            continue
        if averages[i] < averages[j]:
            #averages[i] < averages[j]. 
            #Do something
            print("averages[{}] < averages[{}]".format(i, j))
        elif averages[i] == averages[j]:
            #averages[i] == averages[j]. 
            #Do something
            print("averages[{}] = averages[{}]".format(i, j))
        else:
            #averages[i] > averages[j]. Only possibility left. 
            #Do something
            print("averages[{}] > averages[{}]".format(i, j))

print("Averages: ", averages)

这是输出。运行上面的测试代码,您将获得相同的结果。

averages[0] < averages[1]
averages[0] < averages[2]
averages[0] < averages[3]
averages[1] > averages[0]
averages[1] < averages[2]
averages[1] < averages[3]
averages[2] > averages[0]
averages[2] > averages[1]
averages[2] < averages[3]
averages[3] > averages[0]
averages[3] > averages[1]
averages[3] > averages[2]
Averages:  [2.0, 5.0, 8.0, 11.0]

注意:我在Python 3.7中对此进行了编码