将函数映射到子列表python的一部分

时间:2016-01-26 13:34:07

标签: python performance numpy vectorization

我在python中工作,我有一个列表列表(或者也可能是一个numpy数组),如下所示:

list = [[0, 0, -1], [1, 1, -2], [1, 2, -3], [2, 2, -4]]

我有一个函数,它为每个子列表提供前两个元素并给出结果。让我们假设我正在使用的函数是sum() 所以我想做的是

list1 = [[sum(0, 0), -1], [sum(1, 1), -2], [sum(1, 2), -3], [sum(2, 2), -4]]

,输出

list1 = [[0, -1], [2, -2], [3, -3], [4, -4]]

mapnumpy.vectorize是否可以解决这个问题?我已经可以将它作为一个循环来实现,但它对于我的真实数据来说太贵了。

任何帮助,建议?

3 个答案:

答案 0 :(得分:3)

如果是numpy数组,你应该使用矢量化获得最快的结果:

In [128]: arr = np.asarray(list)
#Out[128]:
#array([[ 0,  0, -1],
#       [ 1,  1, -2],
#       [ 1,  2, -3],
#       [ 2,  2, -4]])

In [129]: np.vstack((arr[:,0]+arr[:,1], arr[:,2])).T
#Out[129]:
#array([[ 0, -1],
#       [ 2, -2],
#       [ 3, -3],
#       [ 4, -4]])

答案 1 :(得分:2)

可能是

[(sum(x, y), z) for x, y, z in list]

或者,如果您坚持使用map使用itertools.starmap

starmap( lambda x, y, z: (x+y, z), list)

答案 2 :(得分:1)

对于您的具体示例,您可以使用列表推导,如下所示:

my_list = [[0, 0, -1], [1, 1, -2], [1, 2, -3], [2, 2, -4]]

answer = [[x + y, z] for x, y, z in my_list]
print(answer)

<强>输出

[[0, -1], [2, -2], [3, -3], [4, -4]]

要对列表中的每个项目应用更复杂的通用函数,请使用map

def func(sublist):
    return [sum(sublist[:2]), sublist[-1]]

my_list = [[0, 0, -1], [1, 1, -2], [1, 2, -3], [2, 2, -4]]

answer = map(func, my_list)

使用功能func,您可以根据需要自定义功能。