Поэлементное добавление двух 3d списков с помощью уменьшения - PullRequest
0 голосов
/ 18 октября 2018

У меня есть массив, который содержит a[0] и a[1] массив 2d и a[2] массив 1d.Я хочу объединить результат map() со следующей строкой через reduce(), но я испытываю некоторые трудности при попытке выполнить numpy из-за формы массива a.

, например:

a = [((1,6), (4,7), (4,5)), ((3,7), (8,2), (2,4)), (2,4,5)]

b = [((3,7), (8,2), (2,4)), ((6,5), (1,7), (4,8)), (7,2,1)] 

result = [((4,13), (12,9), (6,9)), ((9,12), (9,9), (6,12)), (9,6,6)]

Как я могу сделать это в Python?

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

В этом решении реализованы некоторые наивные рекурсивные вложенные версии zip и map:

def nested_map(fnc, it):
    try: 
        return type(it)(nested_map(fnc, sub) for sub in it)
    except TypeError:
        return fnc(it)

def nested_zip(*iterables):
    r = []
    for x in zip(*iterables):
        try:
            r.append(type(x[0])(nested_zip(*x)))
        except TypeError:
            r.append(x)
    return r

nested_map(sum, nested_zip(a, b))
# [((4, 13), (12, 9), (6, 9)), ((9, 12), (9, 9), (6, 12)), (9, 6, 6)]

. Эта реализация обладает дополнительной гибкостью работы для произвольных уровней вложенности:

nested_map(sum, nested_zip([(1, 2), 3, [4]], [(1, 2), 3, [4]]))
# [(2, 4), 6, [8]]
0 голосов
/ 18 октября 2018

Мне нужно придумать эту уродливую вещь для понимания списков, но это может сработать, по крайней мере:

result = [tuple([tuple(row) if not isinstance(row, np.int64) else row for row in np.array(aa)+np.array(bb)]) for aa, bb in zip(a, b)]

a
Out[29]: [((1, 6), (4, 7), (4, 5)), ((3, 7), (8, 2), (2, 4)), (2, 4, 5)]
b
Out[30]: [((3, 7), (8, 2), (2, 4)), ((6, 5), (1, 7), (4, 8)), (7, 2, 1)]
result
Out[31]: [((4, 13), (12, 9), (6, 9)), ((9, 12), (9, 9), (6, 12)), (9, 6, 6)]

Возможно, вам придется настроить np.int64 на ваш тип numpy int по умолчанию.

Использование карты и лямбда-функции в этом может сделать его немного лучше, я думаю.

result = [tuple(map(lambda x: x if isinstance(x, np.int64) else tuple(x), np.array(aa)+np.array(bb))) for aa, bb in zip(a, b)]
...