Numpy意味着有条件

Art*_*nin 9 python numpy

我有在纯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
Run Code Online (Sandbox Code Playgroud)

有没有办法用Numpy重写这个功能?

hel*_*ker 24

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

average_speed = numpy.average(speeds, weights=(speeds > 0))
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助


Tim*_*imY 17

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

speeds_np = np.array(speeds)

speeds_np[speeds_np>0].mean()
Run Code Online (Sandbox Code Playgroud)

说明:

speedsNp > 0创建一个满足(in)相等的相同大小的布尔数组.如果输入speedsNp,它只产生speedNp布尔数组值的相应值True.那么你需要做的只是取得mean()结果.

  • 这绝对是这里最好的答案.谢谢@TimY (3认同)

eum*_*iro 10

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
Run Code Online (Sandbox Code Playgroud)