Numpy: объединить два массива в матрицу, а затем отобразить с помощью лямбды - PullRequest
0 голосов
/ 08 января 2019

Я хочу объединить два numpy.ndarray с (m, n) элементами в матрицу m x n, а затем применить функцию / лямбду для отображения значений.

Например:

import numpy as np
X = np.array([1,2,3])
Y = np.array([4,5,6,7])
Z = cross_combine(X, Y)
# combine two arrays into a matrix containing the tuple (Xi, Yj)
# array([[(1,4), (1,5), (1,6), (1,7)],
#        [(2,4), (2,5), (2,6), (2,7)],
#        [(3,4), (3,5), (3,6), (3,7)]])

Z = Z.map(lambda x, y: x * y)
# map values with a lambda or a function
# array([[4, 5, 6, 7],
#        [8, 10, 12, 14],
#        [12, 15, 18, 21]])

Функция отображения будет сложной. Что такое функции cross_combine и map в numpy? Как я могу достичь этого легко?

Ответы [ 3 ]

0 голосов
/ 08 января 2019

В вашем конкретном примере вы можете использовать np.meshgrid и уменьшать :

import numpy as np


def mesh(values):
    return np.array(np.meshgrid(*values)).T

X = [1,2,3]
Y = [4,5,6,7]

Z = mesh([X, Y])

result = np.multiply.reduce(Z, axis=2)
print(result)

выход

[[ 4  5  6  7]
 [ 8 10 12 14]
 [12 15 18 21]]

Для пользовательской функции вы можете использовать np.frompyfunc :

def_mult = np.frompyfunc(lambda x, y: x * y, 2, 1)
result = def_mult.reduce(Z, axis=2)
print(result)

выход

[[4 5 6 7]
 [8 10 12 14]
 [12 15 18 21]]
0 голосов
/ 08 января 2019

Вы можете выполнить эту операцию следующим образом:

import numpy as np

X = [1, 2, 3]
Y = [4, 5, 6, 7]
Z = np.tensordot(X, Y, axes=0)
print(Z)
# [[ 4  5  6  7]
#  [ 8 10 12 14]
#  [12 15 18 21]]

Для других операций вы можете сделать что-то вроде:

import numpy as np

X = [1, 2, 3]
Y = [4, 5, 6, 7]
X2d = np.asarray(X)[:, np.newaxis]
Y2d = np.asarray(Y)[np.newaxis, :]

print(X2d * Y2d)
# [[ 4  5  6  7]
#  [ 8 10 12 14]
#  [12 15 18 21]]
print(X2d + Y2d)
# [[ 5  6  7  8]
#  [ 6  7  8  9]
#  [ 7  8  9 10]]
print(X2d ** Y2d)
# [[   1    1    1    1]
#  [  16   32   64  128]
#  [  81  243  729 2187]]

РЕДАКТИРОВАТЬ: Или на самом деле просто с:

import numpy as np

X = [1, 2, 3]
Y = [4, 5, 6, 7]

print(np.multiply.outer(X, Y))
# [[ 4  5  6  7]
#  [ 8 10 12 14]
#  [12 15 18 21]]
print(np.add.outer(X, Y))
# [[ 5  6  7  8]
#  [ 6  7  8  9]
#  [ 7  8  9 10]]
print(np.power.outer(X, Y))
# [[   1    1    1    1]
#  [  16   32   64  128]
#  [  81  243  729 2187]]
0 голосов
/ 08 января 2019

Вы можете использовать списочные выражения:

X = [1,2,3]
Y = [4,5,6,7]

Используйте itertools.product в понимании списка, чтобы получить декартово произведение двух списков, сохраняя указанную структуру вложенного списка:

Z = [list(product([x],Y)) for x in X]
#[[(1, 4), (1, 5), (1, 6), (1, 7)],
# [(2, 4), (2, 5), (2, 6), (2, 7)],
# [(3, 4), (3, 5), (3, 6), (3, 7)]]

И использовать сжатие вложенного списка, чтобы применить функцию, сохраняющую структуру:

[[x*y for x,y in z] for z in Z]
#[[4, 5, 6, 7], [8, 10, 12, 14], [12, 15, 18, 21]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...