如果我将函数定义为:
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的情况下做同样的事情(并且没有逐个转换所有参数)?
答案 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