У меня возникла проблема: у меня есть два массива разной формы, которые я хочу перемножить. Допустим, у меня есть два случая (сейчас я использую только нули, потому что меня волнует только форма):
Код: Выделить всё
import numpy as np
n = 5
t = 100
# 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)
Случай Б здесь не работает. Обратите внимание: я также хочу, чтобы выходная форма варианта 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