2016-01-26 4 views
2

Я работаю в Python и у меня есть список списков (или может быть также NumPy массива), как это:Карта функции части Подсписка питон

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

У меня есть функция, которая принимает для каждого вывести первые два элемента и дать результат. Предположим, что функция Я принимаю о том, сумма() так, что я хочу сделать, это

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

Есть ли способ это с map или numpy.vectorize? Я уже могу сделать это как цикл, но это слишком дорого для моих реальных данных.

Любая помощь, совет?

+0

Для фактического повышения производительности, это помогло бы знать об осуществлении фактической функции в контексте. – Divakar

+1

или если вы действительно хотите использовать карту, 'map (lambda x: [sum (x [0: 1]), x [2]], list)' –

+0

Функция просто принимает 2 координаты, первые два значения и выполняет побитовое перемежение для создания своего рода хэша (morton code https://en.wikipedia.org/wiki/Z-order_curve) из координат. Я думаю, что если это сработает для суммы, я смогу применить ее к моей фактической функции. –

ответ

2

Может ли это быть

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

Или, если вы настаиваете на использовании map использования itertools.starmap:

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

?

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 вы можете настроить свою функцию по своему усмотрению.

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

Я использую ответ на комментарии. Для этого конкретного мне нужно использовать [numpy.vectorize] (http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.vectorize.html), чтобы иметь возможность применить функцию к (arr [:, 0], arr [:, 1])? Сумма была просто примером. Моя функция сложнее. –

+0

вы должны добавить функцию, которую хотите использовать, если хотите векторизация! –

Смежные вопросы