Умножение 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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