use*_*574 167 python arrays numpy vector matrix
当我将两个numpy数组(nxn)*(nx 1)相乘时,得到一个大小为(nxn)的矩阵.遵循正常的矩阵乘法规则,期望一个(nx 1)向量,但我根本无法找到有关如何在Python的Numpy模块中完成此操作的任何信息.
问题是我不想手动实现它以保持程序的速度.
示例代码如下所示:
a = np.array([[ 5, 1 ,3], [ 1, 1 ,1], [ 1, 2 ,1]])
b = np.array([1, 2, 3])
print a*b
>>
[[5 2 9]
[1 2 3]
[1 4 3]]
Run Code Online (Sandbox Code Playgroud)
我想要的是:
print a*b
>>
[16 6 8]
Run Code Online (Sandbox Code Playgroud)
wfl*_*nny 266
使用numpy.dot或a.dot(b).请参阅此处的文档.
>>> a = np.array([[ 5, 1 ,3],
[ 1, 1 ,1],
[ 1, 2 ,1]])
>>> b = np.array([1, 2, 3])
>>> print a.dot(b)
array([16, 6, 8])
Run Code Online (Sandbox Code Playgroud)
这是因为numpy数组不是矩阵,标准操作*, +, -, /在数组上按元素工作.相反,您可以尝试使用numpy.matrix,*并将被视为矩阵乘法.
还知道还有其他选择:
如下所述,如果使用python3.5 +,则@运算符可以按预期运行:
>>> print(a @ b)
array([16, 6, 8])
Run Code Online (Sandbox Code Playgroud)如果你想要矫枉过正,你可以使用numpy.einsum.文档将为您提供一个如何工作的风格,但老实说,我还没有完全理解如何使用它,直到阅读这个答案,并自己玩它.
>>> np.einsum('ji,i->j', a, b)
array([16, 6, 8])
Run Code Online (Sandbox Code Playgroud)截至2016年中期(numpy 1.10.1),您可以尝试实验numpy.matmul,它numpy.dot有两个例外:没有标量乘法,但它适用于矩阵堆栈.
>>> np.matmul(a, b)
array([16, 6, 8])
Run Code Online (Sandbox Code Playgroud)numpy.inner函数的方式与numpy.dot 矩阵向量乘法相同,但矩阵矩阵和张量乘法的行为不同(请参阅维基百科关于内积与点积之间的差异,或者参见关于numpy实现的SO答案).
>>> np.inner(a, b)
array([16, 6, 8])
# Beware using for matrix-matrix multiplication though!
>>> b = a.T
>>> np.dot(a, b)
array([[35, 9, 10],
[ 9, 3, 4],
[10, 4, 6]])
>>> np.inner(a, b)
array([[29, 12, 19],
[ 7, 4, 5],
[ 8, 5, 6]])
Run Code Online (Sandbox Code Playgroud)如果您有张量(维数大于或等于1的数组),则可以使用numpy.tensordot可选参数axes=1:
>>> np.tensordot(a, b, axes=1)
array([16, 6, 8])
Run Code Online (Sandbox Code Playgroud)numpy.vdot如果您有一个复数矩阵,请不要使用,因为矩阵将被展平为一维数组,然后它会尝试找到展平矩阵和矢量之间的复共轭点积(由于尺寸不匹配而失败)n*mvs n).
| 归档时间: |
|
| 查看次数: |
374617 次 |
| 最近记录: |