Несоответствие умножения матриц Python numpy в основном измерении

#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) является массивом.

Это мешает вам выполнять какие-либо дальнейшие математические операции.