Поэлементное умножение массивов матриц NumPy

У меня есть два массива NumPy (одинаковой длины), каждый с (одинакового размера, квадратными) матрицами NumPy в качестве элементов. Я хочу выполнить поэлементное матричное умножение этих двух массивов, то есть вернуть один массив, где i-й элемент является матричным произведением i-х элементов моих двух массивов.

Когда я просто пытаюсь умножить массивы вместе, кажется, что программа пытается вычислить матричное произведение массивы, а затем терпит неудачу, потому что их размерность слишком высока (1 для массива + 2 для матриц, которые являются его элементами).

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

Обновлено:

Чтобы уточнить, скажем, у меня есть два массива np.array([A, B, C]) и np.array([X, Y, Z]), где A, B, C, X, Y и Z - все квадратные матрицы 3x3, мне нужна функция, которая вернет np.array([A*X, B*Y, C*Z]), где * - матричное умножение.

Приведите пример ваших данных

Slam 27.10.2018 11:27

Может помочь, если вы опишете массивы как имеющие форму (n, 3, 3). До предоставления @ (np.matmul) лучшим решением было бы: np.einsum('ijk,ikl->ijl', [A,B,C], [X,Y,Z]). Он по-прежнему полезен как способ выражения и визуализации сложных матричных продуктов.

hpaulj 27.10.2018 18:12
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
8 178
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

* в numpy будет выполнять поэлементные операции, то есть:

>>> a
array([[[0.86812606, 0.16249293, 0.61555956],
        [0.12381998, 0.84800823, 0.80731896],
        [0.56910074, 0.4071833 , 0.069167  ]],

       [[0.69742877, 0.45354268, 0.7220556 ],
        [0.86638233, 0.97552151, 0.85580334],
        [0.01171408, 0.35997806, 0.72999056]]])

>>> b
array([[[0.17162968, 0.52103661, 0.05433799],
        [0.19999652, 0.01852179, 0.7936977 ],
        [0.22392469, 0.34535168, 0.92808129]],

       [[0.7044144 , 0.03183893, 0.16469416],
        [0.6214784 , 0.57722859, 0.23789282],
        [0.934214  , 0.61396596, 0.5356328 ]]])

>>> a * b
array([[[0.1489962 , 0.08466477, 0.03344827],
        [0.02476357, 0.01570663, 0.6407672 ],
        [0.12743571, 0.14062144, 0.06419259]],

       [[0.49127887, 0.01444031, 0.11891834],
        [0.5384379 , 0.5630989 , 0.20358947],
        [0.01094346, 0.22101428, 0.39100689]]])

Разве это не то, что вы ищете?

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

Drubbels 27.10.2018 15:36
Ответ принят как подходящий

По умолчанию для массивов numpy операторы являются "поэлементными". Просто используйте оператор @ (умножение матриц) вместо *:

In [24]: A = np.arange(9).reshape(3,3)

In [25]: X = np.array([A[:], A[:]*2, A[:]*3])

In [26]: Y = X[:]

In [27]: X @ Y
Out[27]:
array([[[ 15,  18,  21],
        [ 42,  54,  66],
        [ 69,  90, 111]],

       [[ 60,  72,  84],
        [168, 216, 264],
        [276, 360, 444]],

       [[135, 162, 189],
        [378, 486, 594],
        [621, 810, 999]]])

In [28]: X[0] @ Y[0]
Out[28]:
array([[ 15,  18,  21],
       [ 42,  54,  66],
       [ 69,  90, 111]])

In [29]: X[1] @ Y[1]
Out[29]:
array([[ 60,  72,  84],
       [168, 216, 264],
       [276, 360, 444]])

In [30]: X[2] @ Y[2]
Out[30]:
array([[135, 162, 189],
       [378, 486, 594],
       [621, 810, 999]])

HTH.

Другие вопросы по теме