Умножение Python двух массивов, которые могут иметь или не иметь одинаковую формуPython

Программы на Python
Anonymous
Умножение Python двух массивов, которые могут иметь или не иметь одинаковую форму

Сообщение Anonymous »

У меня возникла проблема: у меня есть два массива разной формы, которые я хочу перемножить. Допустим, у меня есть два случая (сейчас я использую только нули, потому что меня волнует только форма):

Код: Выделить всё

import numpy as np

n = 5
t = 10

# Case A (same shape):
a = np.zeros((n, ))
b = np.zeros((n, ))

resA = a * b
print(resA, "This works!")  # shape(n, )

# Case B (different shape):
a = np.zeros((n, t))
b = np.zeros((n, ))

resA = a * b
print(resA, "This does not work :(") # desired shape(n, t)
Вывод:

Код: Выделить всё

[0. 0. 0. 0. 0.] This works!
Traceback (most recent call last):
File "C:\test.py", line 17, in 
resA = a * b
~~^~~
ValueError: operands could not be broadcast together with shapes (5,10) (5,)
Случай Б здесь не работает. Обратите внимание: я также хочу, чтобы выходная форма варианта B была (n, t), а не (t, n), а это значит, что транспонирование может оказаться некрасивым. Мне нужен способ написать * b, который обрабатывает оба этих случая одновременно (сейчас работает только случай A), но в идеале не хочу использовать операторы if или условные выражения. Я чувствую, что должен быть способ сделать это в стандартном numpy, и я нашел чрезвычайно неуклюжие решения.
Неуклюжее решение:

Код: Выделить всё

# Define a helper function
def match_shape(orig, target):
return np.reshape(orig, orig.shape + (1,) * (target.ndim - orig.ndim))


Такой подход к изменению формы кажется мне довольно странным, и я готов поспорить, что существует более элегантное и эффективное решение. Вы также можете добиться чего-то подобного, добавляя везде транспонирование, но это тоже кажется неидеальным. Любая помощь очень ценится! Спасибо!


Подробнее здесь: https://stackoverflow.com/questions/798 ... same-shape

Вернуться в «Python»