#python #numpy #matrix #numeric
Вопрос:
Я пытаюсь умножить матрицу 2×2 на матрицу 2×1. В обеих матрицах есть записи, которые являются линейными пространствами, так что результирующая матрица 2×1 дает мне значение для каждого значения линейного пространства.
Однако я получаю эту ошибку размерности.
matmul: Входной операнд 1 имеет несоответствие в своем основном измерении 0, с сигнатурой gufunc (n?,k),(k,m?)-gt;(n?,m?) (размер 1 отличается от 2)
Для удобства чтения я публикую не весь код, а то, что необходимо.
Я также заменил значения linspace ориентировочным текстом.
Матрица «L» является результатом других умножений 2×2, которые содержат константы, поэтому ошибок там нет.
Матрица B (2×2) дает желаемый результат, поэтому проблема сводится к умножению между B и C.
import numpy as np from sympy import * # Defining range of values z = np.linspace(initial, final, 10) g = np.linspace(initial, final, 10) y = np.linspace(initial, final, 10) # Matrix operations A = np.array([[1, z], [0, 1]], dtype=object) B = np.matmul(L,A) C = np.array([[y],[g]]) D = np.matmul(B, C) print(total)
Альтернативный POV того, что я пытаюсь сделать, заключается в том, что для матрицы «B» при умножении на 2×1 «C», которая содержит неизвестные, для вычисления этих неизвестных «y» и «g»
Большое спасибо,
P. S; Для массива «C» с записями с одним значением умножение выполняется, как и ожидалось.
Редактировать; Согласно предложению mozway, я предоставляю отпечатки массива «A» и «M», которые сделают все более понятным, но пусть M = B
Комментарии:
1. Почему такой
sympy
импорт?2. Использовал sympy для некоторых предварительных символических вычислений
Ответ №1:
In [66]: initial, final = 0,1 In [67]: z = np.linspace(initial,final,11) In [68]: z Out[68]: array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])
A
равно (2,2), но содержит сочетание массива и скаляров
In [69]: A = np.array([[1,z],[0,1]], object) In [70]: A Out[70]: array([[1, array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])], [0, 1]], dtype=object) In [71]: A.shape Out[71]: (2, 2)
Теперь создайте (2,2) числовой массив:
In [72]: L = np.eye(2) In [75]: L[1,1] = 2 In [76]: np.matmul(L,A) Out[76]: array([[1.0, array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])], [0.0, array([2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2.])]], dtype=object)
matmul
работает с массивами типов объектов dtype, при условии, что элементы реализуют необходимые
и *
. Результатом по-прежнему является (2,2), но (1,1) термин 2*z
.
Теперь перейдем к C
:
In [77]: C = np.array([[z],[z]]) In [78]: C Out[78]: array([[[0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ]], [[0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ]]]) In [79]: C.shape Out[79]: (2, 1, 11)
Это плавающий dtype, 3d-массив.
In [81]: B=Out[76] In [82]: np.matmul(B,C) Traceback (most recent call last): File "lt;ipython-input-82-5eababb7341egt;", line 1, in lt;modulegt; np.matmul(B,C) ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)-gt;(n?,m?) (size 1 is different from 2) In [83]: B.shape Out[83]: (2, 2) In [84]: C.shape Out[84]: (2, 1, 11)
Есть несоответствие в формах. Но измените C
определение, чтобы это был 2d-массив:
In [85]: C = np.array([z,z]) In [86]: C.shape Out[86]: (2, 11) In [87]: np.matmul(B,C) Out[87]: array([[array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]), array([0.1 , 0.11, 0.12, 0.13, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.2 ]), ... array([1.8, 1.8, 1.8, 1.8, 1.8, 1.8, 1.8, 1.8, 1.8, 1.8, 1.8]), array([2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2.])]], dtype=object) In [88]: _.shape Out[88]: (2, 11)
Здесь (2,2) B
матмулы с (2,11) просто отлично производят (2,11). Но каждый элемент сам по себе является массивом (11,) — из-за z
используемого при определении A
.
Но вы говорите, что хотите (2,1) C
. Чтобы получить это, мы должны использовать:
In [91]: C = np.empty((2,1), object) In [93]: C[:,0]=[z,z] In [94]: C Out[94]: array([[array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])], [array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])]], dtype=object)
Будьте очень осторожны при попытке создать object
массивы dtype. Все может быть не так, как вы ожидаете.
Теперь matmul из (2,2) с (2,1) =gt; (2,1), тип объекта dtype
In [95]: D = np.matmul(B,C) In [96]: D.shape Out[96]: (2, 1) In [99]: D Out[99]: array([[array([0. , 0.11, 0.24, 0.39, 0.56, 0.75, 0.96, 1.19, 1.44, 1.71, 2. ])], [array([0. , 0.2, 0.4, 0.6, 0.8, 1. , 1.2, 1.4, 1.6, 1.8, 2. ])]], dtype=object)
Имейте в виду, что matmul
это очень быстро при работе с числовыми массивами dtype. Он действительно работает с массивами типов dtype объектов, но скорость намного медленнее, больше похоже на использование понимания списка.
Ответ №2:
Не уверен, что вы пытаетесь сделать (вы должны привести воспроизводимый пример, в настоящее время существует много отсутствующих переменных), и ожидаемый результат.
Тем не менее, определение A
в корне неверно. Я предполагаю, что вы ожидаете массив 2×2, но, как z
(10,)
и массив в форме, вы получите странный массив объектов, элемент которого (0,1) является массивом.
Это мешает вам выполнять какие-либо дальнейшие математические операции.