有条件的平均数

2024-05-20 19:23:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有用纯python计算平均速度的算法:

    speed = [...]
    avg_speed = 0.0
    speed_count = 0
    for i in speed:
        if i > 0: # I dont need zeros
            avg_speed += i
            speed_count += 1

    if speed_count == 0:
        return 0.0

    return avg_speed / speed_count

有没有办法用Numpy重写这个函数?


Tags: 函数innumpy算法forreturnifcount
3条回答
import numpy as np

def avg_positive_speed(speed):
    s = np.array(speed)
    positives = s > 0
    if positives.any():
        return s[positives].mean()
    else:
        return 0.


speed = [1., 2., 0., 3.]
print avg_positive_speed(speed)
# prints 2.0

print avg_positive_speed([0., 0.])
# prints 0.0

我很惊讶没有人提出最短的解决方案:

speeds_np = np.array(speeds)

speeds_np[speeds_np>0].mean()

说明:

speedsNp > 0创建一个满足(in)等式的大小相同的布尔数组。如果输入speedsNp,它只产生对应的speedNp值,其中布尔数组的值为True。那么,您只需要获取结果的mean()

函数numpy.average可以接收一个weights参数,在该参数中,您可以将由应用于数组本身的某个条件生成的布尔数组放在该数组中-在这种情况下,元素大于0:

average_speed = numpy.average(speeds, weights=(speeds > 0))

希望这有帮助

相关问题 更多 >