Python np.arange奇怪的行为

时间:2018-07-13 08:10:43

标签: python numpy

np.arange函数在我的代码中表现很奇怪。 24是我的增量,在此示例中,它打印“ ortalama” 24次。为什么会这样?

import numpy as np
import pandas as pd
from kafka import KafkaConsumer
i=0
j=0
k=0
array=np.zeros((100000, 4))
sums=np.zeros(100000)

consumer = KafkaConsumer('005', group_id='my-group',bootstrap_servers=['localhost:9092'])

for message in consumer:
    a=message.value
    a=a.decode("utf-8") 
    a = a.split(',')
    for j in range(0,4):
        array[i,j]=a[j]     
    #print(array)
    if i%60==0 and i>60:        
        b= array[i-60:i,3] 
        total=np.sum(b)
        sums[k]=total
        k=k+1
        l=np.arange(0, k, 24)       
        ortalama=np.mean(sums[l])
        print(ortalama)
        if ortalama>=219000:
            print("1")
    i=i+1  

1 个答案:

答案 0 :(得分:0)

代码重构

首先要了解此代码的问题,我们继续进行重构:

模拟预期消息的类

根据需要自定义此类,以模拟来自您的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的vstackappend扩展数组,而不是定义一些常量。我也将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值列表,从0len(sums),并带有一个步骤24np.arange没什么问题。

您的代码做什么

您有一个数组sums,每60次迭代将数组my_array第三列的最后60次迭代的总和相加。

然后,您继续生成l,然后根据索引为sums的{​​{1}}的值创建平均值。 这仅取决于您收到的消息。

当该平均值大于或等于给定的l时,您将打印一条消息。

复制核心

让我们假设每个窗口的总和为常数MAX_MEAN。我们称这些常数为constant_sum。显然,您的平均elements值等于ortalama

如您所见,constant_sum在功能上得到了简化,并且仅在输入消息的功能中被考虑。

elements_step