Неисправность повторяющегося массива для усреднения групп из 3 чисел и сравнения с другими группами из 3 чисел - PullRequest
0 голосов
/ 30 мая 2019

У меня есть массив из 12 чисел. Я пытаюсь создать цикл, который берет первые 3 и усредняет их. Затем сравнивается, меньше ли оно следующих трех и трех после этого и т. Д.

Я пробовал elif, но слишком много условий, чтобы указать

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]

вот как я предотвращаю IndexError: индекс 12 выходит за пределы оси 0 с размером 12

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

Я хочу сравнить цели со средним значением (k + 2, k + 3, k + 4) и (k + 5, k + 6, k + 7) и (k + 8, k + 9, k +10)

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

Я не могу понять, как получить значения для avg на основе суммы трех других зон массива, который я сравниваю с

Я думал об этом

    if k < 8:
            range1_target1 = array[k+2]
            range1_target2 = array[k+3]
            range1_target3 = array[k+4]

но было слишком много вариантов условий для эффективного кодирования

1 Ответ

0 голосов
/ 30 мая 2019

Сначала определите функцию усреднения, функцию, которая вычисляет среднее значение в итерируемом объекте:

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

Эта функция довольно проста.Он определяет переменную с именем «sum» и устанавливает ее начальное значение равным 0. Затем он проходит по параметру «iterable», добавляет к сумме все значения каждого элемента в итерируемом параметре.Затем он делит сумму всех значений (переменную суммы) на длину итерации.Возвращает результат в виде числа с плавающей запятой.

Пример: функция вызывается.Итерируемый аргумент присваивается списку [25, 75, -100, 20].Переменная sum начинается с 0. Посредством циклического повторения итераций она добавляет к сумме 25, 75, -100 и 20.Сумма заканчивается 20. Длина итерируемого, согласно методу len () в Python, равна 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]))

Метод добавления списка добавляет параметр, который он принимает, в конец списка.[Counter: counter + 3: 1] является индексом среза.Конструктор среза аналогичен диапазону, за исключением того, что это можно сделать с помощью этого формата: 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

Вот как это делается.Мы проверяем индексы на средних значениях вместо самих средних для проверки на дубликаты.Если индексы совпадают друг с другом, мы продолжаем цикл, потому что не хотим иметь с ними дело.В противном случае мы сравниваем средние [i] со средними [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

...