Python np.arange странное поведение

Вы можете попробовать использовать мой модуль mailer .

from mailer import Mailer
from mailer import Message

message = Message(From="me@example.com",
                  To="you@example.com")
message.Subject = "An HTML Email"
message.Html = """

Hi!
How are you?
Here is the link you wanted.

""" sender = Mailer('smtp.example.com') sender.send(message)

0
задан DavidG 13 July 2018 в 08:23
поделиться

1 ответ

Рефакторинг кода

Чтобы понять, что не так с этим кодом, мы в первую очередь переходим к рефакторингу:

Класс для моделирования ожидаемых сообщений

Настроить этот класс необходимо для симуляции среднего сообщения от вашего Kafka.

class Message:
    """Class to simulate expected Kafka message."""
    def __init__(self):
        self.value = "10,20,30,40".encode()

Генератор случайных сообщений

Настройте этот генератор для имитации правдоподобного сообщения от Kafka.

import random
import time

def message_generator(n):
    """Yield a generated Kafka message."""
    for i in range(n):
        time.sleep(random.uniform(0, 0.001))
        yield Message()

Рефакторизованный код

Прежде чем перейти к любому рассмотрению кода, давайте немного обработаем этот код, используя numpy vstack и append для расширения массивов, кроме определения некоторых констант. Я также переименовал array в my_array.

import numpy as np
my_array, sums = np.empty((0, 4)), np.empty((1))
STEP = 60
MESSAGES = 100000   
MAX_MEAN = 219000 

for i, message in enumerate(message_generator(MESSAGES)):
    values = np.array(message.value.decode("utf-8").split(',')).astype(float)
    my_array = np.vstack([my_array, values])
    if i % STEP == 0 and i > STEP:
        sums = np.append(sums, np.sum(my_array[i - STEP:i, 3]))
        l = np.arange(0, len(sums), 24)
        if np.mean(sums[l]) >= MAX_MEAN:
            print("Large ortalama")

Обозначение кода

Развенчание вашего утверждения о том, что любая проблема с np.arange

Теперь , ваш код создает список l значений, от 0 до len(sums), с шагом 24. Нет ничего плохого в np.arange.

Что делает ваш код

У вас есть массив sums, к которому вы добавляете каждые 60 итераций сумму последних 60 итераций третий столбец вашего массива my_array.

Затем вы переходите к генерации l, а затем создаете среднее значение из значений sums с индексами из l. Это зависит только от получаемых вами сообщений.

Когда такое значение больше или равно заданному MAX_MEAN, вы печатаете сообщение.

Репликация ядра

Предположим, что сумма каждого окна является константой constant_sum. Назовем множество этих констант elements. Очевидно, что ваше среднее значение ortalama равно constant_sum.

Как вы можете видеть, elements_step упрощается от функции и рассматривается только в функции входных сообщений.

elements = np.array([])
elements_step = 5
constant_sum = 1000
upper_limit = 10000
for i in range(1000):
    elements = np.append(elements, constant_sum)
    l = np.arange(0, len(elements), elements_step)
    ortalama = np.mean(elements[l])
    if ortalama >= upper_limit:
        print("Large ortalama")
0
ответ дан Luca Cappelletti 17 August 2018 в 13:22
поделиться
  • 1
    Благодарим вас за подробные объяснения. Меня озадачивает то, что значения ortalama печатаются ровно столько раз, сколько приращение функции np.arange. – Yashar Ahmadov 13 July 2018 в 10:28
  • 2
    Я добавил объяснение, почему ortolama зависит только от сообщений, демонстрируя, как с помощью постоянных сообщений параметр np.arange полностью упрощается. – Luca Cappelletti 13 July 2018 в 10:52
Другие вопросы по тегам:

Похожие вопросы: