以列表/标量作为参数的函数

时间:2014-07-23 15:43:41

标签: python numpy

如果我将函数定义为:

def somefunc(a, b, c):
    out = [ (a+b)/c for a, b, c in zip(a, b, c) ]
    return out

所有参数必须是相同长度的列表,否则我会将输出截断。示例:somefunc([1, 2], [3, 4], [5, 5])会给我[0.8, 1.2]

当它没有变化时,能够输入单个数字而不是列表非常方便,例如:somefunc([1, 2], [3, 4], 5)。当然,任何参数都可以简化为单个值而不是列表。这可以通过numpy使用此函数定义来实现:

from numpy import array

def somefunc(a, b, c):

    a=array(a)
    b=array(b)
    c=array(c)

    out = (a+b)/c
    return out

有没有办法在没有numpy的情况下做同样的事情(并且没有逐个转换所有参数)?

2 个答案:

答案 0 :(得分:2)

当然,你可以创建一个无限列表,重复任何不是列表的参数。

from itertools import repeat

def broadcast(o):
    return o if hasattr(o, '__iter__') else repeat(o)

def somefunc(a, b, c):
    out = [ (a+b)/c for a, b, c in zip(broadcast(a), broadcast(b), broadcast(c)) ]
    return out

>>> somefunc([1, 2], [3, 4], 5)
[0.8, 1.2]
>>> somefunc([1, 2], 5, [3, 4])
[2.0, 1.75]
>>> 

答案 1 :(得分:1)

Numpy很棒,非常适合像您发布的那样进行矢量化计算。我建议你使用它。

此外,您不需要将所有参数转换为数组,只需要一个,并且最好使用asarray,这样可以避免在没有必要时创建新副本。

def somefunc(a, b, c):
    return (asarray(a) + b) / c