功能类似于内置映射但支持numpy广播

时间:2016-06-22 16:46:39

标签: python arrays numpy

我想编写一个函数amap,它类似于内置map,但支持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

它有效,但它有些丑陋而且效率不高。  你有什么好主意吗?特别是那些更时尚的东西?

1 个答案:

答案 0 :(得分: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]])