2016-06-22 37 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