如何在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(),尝试将它们转换为数组,但我不断收到签名匹配类型错误(我认为这是因为第二个矩阵由字符串组成)。我怎样才能将这些相乘得到我的方程式?

您的假设是正确的:矩阵乘法没有在非数字类型上定义。我们确实有简单的字符串整数复制:'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)