如何在numpy中将矩阵与代数相乘
How to multiply matricies with algebra in numpy
我的代码中有两个 numpy 矩阵对象,一个是数字矩阵,另一个是我不想为其赋值的变量矩阵。我想要的结果是这样的:
[[ 1., 0., 0., 0., 0., 1., 0., 0., 0.],
[ 0., 1., 0., 0., 0., 1., -1., 1., -1.],
[ 0., 0., 1., 0., 0., 1., 0., 0., 0.],
[ 0., 0., 0., 1., 0., 0., 0., 1., -1.],
[ 0., 0., 0., 0., 1., -1., 0., 0., 1.]]
multiplied by the column vector
[['i8'],
['i4'],
['i9'],
['i5'],
['i2'],
['i1'],
['i7'],
['i6'],
['i3']]
Gives:
[[ i8+i1],
[i4+i1-i7+i6-i3],
[ i9+i1],
[ i5+i6-i3],
[ i2-i1+i3]]
我查看了 numpy 线性代数部分,但找不到任何有用的东西。我试过使用 np.dot()、np.multiply(),尝试将它们转换为数组,但我不断收到签名匹配类型错误(我认为这是因为第二个矩阵由字符串组成)。我怎样才能将这些相乘得到我的方程式?
- 我知道不建议使用 numpy 矩阵对象,在这里实现它们的原因是因为我用来获取这些矩阵的 python 包以这种方式返回它们。
您的假设是正确的:矩阵乘法没有在非数字类型上定义。我们确实有简单的字符串整数复制:'i5' * 2 产生 'i5i5',这不是您需要的。另请注意,您使用的是浮点系数,因此即使 解释也是无效的。
您似乎在使用符号线性代数。 NumPy 没有针对此域的内置操作。根据您的应用程序,您可以使用 sympy
。如果没有,我希望您需要定义自己的 class.
对于对象 dtype 数组,np.dot
等函数尝试将操作委托给元素的乘法和加法。
因此我定义了一个class:
In [467]: class Y:
...: def __init__(self,astr):
...: self.value = astr
...: def __repr__(self):
...: return self.value
...: def __mul__(self, other):
...: if other==0:
...: return Y('')
...: elif other==1:
...: return self
...: elif other==-1:
...: return Y('-'+self.value)
...: else:
...: return Y(str(other)+self.value)
...: def __add__(self, other):
...: if self.value=='':
...: return other
...: elif other.value=='':
...: return self
...: else:
...: return Y(self.value+'+'+other.value)
...:
并制作对象数组:
In [468]: y = np.array([Y('i1'),Y('i8'),Y('j3')])
In [469]: y
Out[469]: array([i1, i8, j3], dtype=object)
这样 dot
看起来很合理。
In [470]: np.dot(y,[-1,0,1])
Out[470]: -i1+j3
In [471]: type(_)
Out[471]: __main__.Y
Y
可能需要进行一些调整,但这提供了基本思路。
但请注意,所有这些乘法和加法都是在 Python 中进行的。 None 是经过编译的,所以它的速度没有什么特别之处。
还有你的数组,稍微调整一下:
In [474]: In [437]: x = np.array([[ 1., 0., 0., 0., 0., 1., 0., 0., 0.],
...: ...: [ 0., 1., 0., 0., 0., 1., -1., 1., -1.],
...: ...: [ 0., 0., 1., 0., 0., 1., 0., 0., 0.],
...: ...: [ 0., 0., 0., 1., 0., 0., 0., 1., -1.],
...: ...: [ 0., 0., 0., 0., 1., -1., 0., 0., 1.]], dtype=int)
...: ...:
...: ...: #multiplied by the column vector
...: ...:
...: ...: y = np.array([['i8'],
...: ...: ['i4'],
...: ...: ['i9'],
...: ...: ['i5'],
...: ...: ['i2'],
...: ...: ['i1'],
...: ...: ['i7'],
...: ...: ['i6'],
...: ...: ['i3']])
...:
In [475]: x
Out[475]:
array([[ 1, 0, 0, 0, 0, 1, 0, 0, 0],
[ 0, 1, 0, 0, 0, 1, -1, 1, -1],
[ 0, 0, 1, 0, 0, 1, 0, 0, 0],
[ 0, 0, 0, 1, 0, 0, 0, 1, -1],
[ 0, 0, 0, 0, 1, -1, 0, 0, 1]])
In [476]: y
Out[476]:
array([['i8'],
['i4'],
['i9'],
['i5'],
['i2'],
['i1'],
['i7'],
['i6'],
['i3']], dtype='<U2')
In [477]: y = np.frompyfunc(Y,1,1)(y)
In [478]: y
Out[478]:
array([[i8],
[i4],
[i9],
[i5],
[i2],
[i1],
[i7],
[i6],
[i3]], dtype=object)
和圆点:
In [479]: np.dot(y.T,x.T)
Out[479]:
array([[i8+i1, i4+i1+-i7+i6+-i3, i9+i1, i5+i6+-i3, i2+-i1+i3]],
dtype=object)
我的代码中有两个 numpy 矩阵对象,一个是数字矩阵,另一个是我不想为其赋值的变量矩阵。我想要的结果是这样的:
[[ 1., 0., 0., 0., 0., 1., 0., 0., 0.],
[ 0., 1., 0., 0., 0., 1., -1., 1., -1.],
[ 0., 0., 1., 0., 0., 1., 0., 0., 0.],
[ 0., 0., 0., 1., 0., 0., 0., 1., -1.],
[ 0., 0., 0., 0., 1., -1., 0., 0., 1.]]
multiplied by the column vector
[['i8'],
['i4'],
['i9'],
['i5'],
['i2'],
['i1'],
['i7'],
['i6'],
['i3']]
Gives:
[[ i8+i1],
[i4+i1-i7+i6-i3],
[ i9+i1],
[ i5+i6-i3],
[ i2-i1+i3]]
我查看了 numpy 线性代数部分,但找不到任何有用的东西。我试过使用 np.dot()、np.multiply(),尝试将它们转换为数组,但我不断收到签名匹配类型错误(我认为这是因为第二个矩阵由字符串组成)。我怎样才能将这些相乘得到我的方程式?
- 我知道不建议使用 numpy 矩阵对象,在这里实现它们的原因是因为我用来获取这些矩阵的 python 包以这种方式返回它们。
您的假设是正确的:矩阵乘法没有在非数字类型上定义。我们确实有简单的字符串整数复制:'i5' * 2 产生 'i5i5',这不是您需要的。另请注意,您使用的是浮点系数,因此即使 解释也是无效的。
您似乎在使用符号线性代数。 NumPy 没有针对此域的内置操作。根据您的应用程序,您可以使用 sympy
。如果没有,我希望您需要定义自己的 class.
对于对象 dtype 数组,np.dot
等函数尝试将操作委托给元素的乘法和加法。
因此我定义了一个class:
In [467]: class Y:
...: def __init__(self,astr):
...: self.value = astr
...: def __repr__(self):
...: return self.value
...: def __mul__(self, other):
...: if other==0:
...: return Y('')
...: elif other==1:
...: return self
...: elif other==-1:
...: return Y('-'+self.value)
...: else:
...: return Y(str(other)+self.value)
...: def __add__(self, other):
...: if self.value=='':
...: return other
...: elif other.value=='':
...: return self
...: else:
...: return Y(self.value+'+'+other.value)
...:
并制作对象数组:
In [468]: y = np.array([Y('i1'),Y('i8'),Y('j3')])
In [469]: y
Out[469]: array([i1, i8, j3], dtype=object)
这样 dot
看起来很合理。
In [470]: np.dot(y,[-1,0,1])
Out[470]: -i1+j3
In [471]: type(_)
Out[471]: __main__.Y
Y
可能需要进行一些调整,但这提供了基本思路。
但请注意,所有这些乘法和加法都是在 Python 中进行的。 None 是经过编译的,所以它的速度没有什么特别之处。
还有你的数组,稍微调整一下:
In [474]: In [437]: x = np.array([[ 1., 0., 0., 0., 0., 1., 0., 0., 0.],
...: ...: [ 0., 1., 0., 0., 0., 1., -1., 1., -1.],
...: ...: [ 0., 0., 1., 0., 0., 1., 0., 0., 0.],
...: ...: [ 0., 0., 0., 1., 0., 0., 0., 1., -1.],
...: ...: [ 0., 0., 0., 0., 1., -1., 0., 0., 1.]], dtype=int)
...: ...:
...: ...: #multiplied by the column vector
...: ...:
...: ...: y = np.array([['i8'],
...: ...: ['i4'],
...: ...: ['i9'],
...: ...: ['i5'],
...: ...: ['i2'],
...: ...: ['i1'],
...: ...: ['i7'],
...: ...: ['i6'],
...: ...: ['i3']])
...:
In [475]: x
Out[475]:
array([[ 1, 0, 0, 0, 0, 1, 0, 0, 0],
[ 0, 1, 0, 0, 0, 1, -1, 1, -1],
[ 0, 0, 1, 0, 0, 1, 0, 0, 0],
[ 0, 0, 0, 1, 0, 0, 0, 1, -1],
[ 0, 0, 0, 0, 1, -1, 0, 0, 1]])
In [476]: y
Out[476]:
array([['i8'],
['i4'],
['i9'],
['i5'],
['i2'],
['i1'],
['i7'],
['i6'],
['i3']], dtype='<U2')
In [477]: y = np.frompyfunc(Y,1,1)(y)
In [478]: y
Out[478]:
array([[i8],
[i4],
[i9],
[i5],
[i2],
[i1],
[i7],
[i6],
[i3]], dtype=object)
和圆点:
In [479]: np.dot(y.T,x.T)
Out[479]:
array([[i8+i1, i4+i1+-i7+i6+-i3, i9+i1, i5+i6+-i3, i2+-i1+i3]],
dtype=object)