Python 核心维度中的 numpy 矩阵乘法不匹配
Python numpy matrix multiplication mismatch in core dimension
我正在尝试将 2x2 矩阵与 2x1 矩阵相乘。两个矩阵都有 linspaces 的条目,这样生成的 2x1 矩阵会为 linspace 的每个值提供一个值。
但是我得到了这个维度错误。
matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 1 is different from 2)
为了便于阅读,我没有发布整个代码,而是发布必要的代码。
我还用指示性文本替换了 linspace 值。
矩阵“L”是其他包含常量的 2x2 乘法的结果,因此没有错误。
矩阵 B (2x2) 给出了期望的结果,因此问题归结为 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”与包含未知数的 2x1“C”相乘时,计算那些未知数“y”和“g”
非常感谢,
P.S;对于具有单值条目的数组“C”,乘法按预期运行。
编辑;根据 mozway 的建议,我提供了数组“A”和“M”的打印,这将使内容更清晰,但让 M = B
不确定你要做什么(你应该提供一个可重现的例子,目前有很多缺失的变量),以及预期的输出。
然而,A
的定义从根本上是错误的。我想你期望一个 2x2 数组,但是由于 z
是一个 (10,)
形数组,你最终会得到 A 是一个奇怪的对象数组,其元素 (0,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)
这是浮点数据类型,3d 数组。
In [81]: B=Out[76]
In [82]: np.matmul(B,C)
Traceback (most recent call last):
File "<ipython-input-82-5eababb7341e>", line 1, in <module>
np.matmul(B,C)
ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(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
定义,使其成为二维数组:
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
matmuls 与 (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 数组时要非常小心。事情可能不是你所期望的。
现在 (2,2) 的 matmul 与 (2,1) => (2,1), object 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 数组,但速度要慢得多,更像是使用列表理解。
我正在尝试将 2x2 矩阵与 2x1 矩阵相乘。两个矩阵都有 linspaces 的条目,这样生成的 2x1 矩阵会为 linspace 的每个值提供一个值。
但是我得到了这个维度错误。
matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 1 is different from 2)
为了便于阅读,我没有发布整个代码,而是发布必要的代码。
我还用指示性文本替换了 linspace 值。
矩阵“L”是其他包含常量的 2x2 乘法的结果,因此没有错误。
矩阵 B (2x2) 给出了期望的结果,因此问题归结为 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”与包含未知数的 2x1“C”相乘时,计算那些未知数“y”和“g”
非常感谢,
P.S;对于具有单值条目的数组“C”,乘法按预期运行。
编辑;根据 mozway 的建议,我提供了数组“A”和“M”的打印,这将使内容更清晰,但让 M = B
不确定你要做什么(你应该提供一个可重现的例子,目前有很多缺失的变量),以及预期的输出。
然而,A
的定义从根本上是错误的。我想你期望一个 2x2 数组,但是由于 z
是一个 (10,)
形数组,你最终会得到 A 是一个奇怪的对象数组,其元素 (0,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)
这是浮点数据类型,3d 数组。
In [81]: B=Out[76]
In [82]: np.matmul(B,C)
Traceback (most recent call last):
File "<ipython-input-82-5eababb7341e>", line 1, in <module>
np.matmul(B,C)
ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(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
定义,使其成为二维数组:
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
matmuls 与 (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 数组时要非常小心。事情可能不是你所期望的。
现在 (2,2) 的 matmul 与 (2,1) => (2,1), object 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 数组,但速度要慢得多,更像是使用列表理解。