2016-06-22 43 views
0

我想要寫的函數amap其類似於集結在map但支持numpy的廣播和輸出數組的函數。它會這樣工作:類似於集結在地圖,支持numpy的廣播

>>> amap(lambda x:x**2, 1) 
array(1) 
>>> amap(lambda x:x**2, [1, 2]) 
array([1, 4]) 
>>> amap(lambda x,y:y**2+x**2, 1, [1, 2]) 
array([2, 5]) 
>>> amap(lambda x,y:y**2+x**2, [1, 2], [[1], [2]]) 
array([[2, 5], [5, 8]]) 

傳入的函數對標量進行操作。

我寫了一個實現。

def amap(func, *args): 
    '''array version of build-in map 
    amap(function, scalar/sequence[, ...]) -> array 
    ''' 
    args = np.broadcast(None, *args) 
    res = [func(*arg[1:]) for arg in args] 
    res = np.asarray(res).reshape(args.shape) 
    return res 

它的作品,但它是某種醜陋的,不是很有效。 你有什麼好的想法做到這一點?特別是更加樸實時尚的東西?

+0

'lambda'(函數)是對整個數組還是標量運算? – hpaulj

+0

你期待什麼樣的效率?帶標量或數組操作的迭代調用? – hpaulj

+0

@hpaulj該函數僅對標量進行操作,通常它是一個複雜的函數,並且很難操作數組。我認爲用額外的'None'進行廣播並且使''arg [1:]'減少'None'效率不高。 –

回答

0

使用numpy.vectorize直接?

>>> numpy.vectorize(lambda x:x**2)(1) 
array(1) 
>>> numpy.vectorize(lambda x:x**2)([1,2]) 
array([1, 4]) 
>>> numpy.vectorize(lambda x, y: y**2 + x**2)(1, [1,2]) 
array([2, 5]) 
>>> numpy.vectorize(lambda x, y: y**2 + x**2)([1,2], [[1], [2]]) 
array([[2, 5], 
     [5, 8]]) 
+0

'vectorize'效率不高,在內部它相當醜陋(即很長)。 – hpaulj