2014-07-23 23 views
0

如果我定義一個函數爲:功能的列表/標量作爲參數

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

不,'zip'需要迭代參數;如果你的函數使用了不可迭代的參數,你將不得不轉換它們。 – jonrsharpe

+0

注意:如果你想要NumPy功能,最簡單的方法就是使用NumPy。當然每個功能都可以在沒有NumPy的情況下實現,但如果這很容易,NumPy就不會在這裏。 – user2357112

回答

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] 
>>> 
+0

好吧,但如果標量參數不是最後一個,它不起作用:'somefunc([1,2],3,[5,5])' – gaggio

+0

我認爲你評論了錯誤的答案。如果前兩個參數中的任何一個都是標量,則rroowwllaanndd的解決方案不起作用。我的確如此。 –

+0

ooops你是對的,但現在另一個已被編輯,它也可以工作。謝謝 – gaggio

1

Numpy非常棒,並且非常適合矢量化您發佈的計算。我建議你使用

此外,您不需要將所有參數轉換爲數組,只能使用一個,最好使用asarray,這樣可避免在不需要時創建新副本。

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