当我将两个numpy个大小为(N X N)*(N X 1)的数组相乘时,得到一个大小为(N X N)的矩阵.按照正常的矩阵乘法规则,需要一个(N X 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]]

我想要的是:

print a*b
   >>
   [16 6 8]

推荐答案

最简单的解决方案

使用numpy.dota.dot(b).参见文档here.

>>> 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])

之所以会出现这种情况,是因为numpy数组不是矩阵,标准操作*, +, -, /在数组上按元素运行.

请注意,虽然您可以使用numpy.matrix(截至2021年初),其中*将被视为标准矩阵乘法,但104.见the note in its documentation(转载于下文):

不再建议使用该类,即使对于线性代数也是如此.而是使用常规array.这门课将来可能会被取消.

Thanks @HopeKing.


其他解决方案

另外,您还可以 Select 其他选项:

  • 如下所述,如果使用python3.5+@操作员按照您的预期工作:

    >>> print(a @ b)
    array([16, 6, 8])
    
  • 如果你想杀过头,你可以用numpy.einsum.文档会让您了解它的工作原理,但老实说,直到阅读this answer并自己动手操作之后,我才完全理解如何使用它.

    >>> np.einsum('ji,i->j', a, b)
    array([16, 6, 8])
    
  • 从2016年年中开始(NumPy 1.10.1),您可以try 实验性的numpy.matmul,它的工作方式与numpy.dot类似,但有两个主要的例外:没有标量乘法,但它可以处理矩阵堆栈.

    >>> np.matmul(a, b)
    array([16, 6, 8])
    
  • 对于矩阵和张量乘法,numpy.inner的功能与numpy.dot for matrix-vector multiplication but behaves differently的功能相同(参见维基百科,了解the inner product and dot product与numpy实现的区别).

    >>> 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]])
    

边缘 case 的稀有选项

  • 如果有张量(维数大于或等于1的数组),可以将numpy.tensordot与可选参数axes=1一起使用:

    >>> np.tensordot(a, b, axes=1)
    array([16,  6,  8])
    
  • Don't use 100如果你有一个复数矩阵,因为矩阵将被展平为1D数组,那么它将试图找到展平矩阵和向量之间的复共轭点积(由于大小不匹配n*m vs n,这将失败).

Python相关问答推荐

Pandas 在最近的日期合并,考虑到破产

将整组数组拆分为最小值与最大值之和的子数组

不理解Value错误:在Python中使用迭代对象设置时必须具有相等的len键和值

在线条上绘制表面

无法定位元素错误404

如果值发生变化,则列上的极性累积和

实现自定义QWidgets作为QTimeEdit的弹出窗口

使用Python更新字典中的值

移动条情节旁边的半小提琴情节在海运

在ubuntu上安装dlib时出错

在Python中,从给定范围内的数组中提取索引组列表的更有效方法

Plotly Dash Creating Interactive Graph下拉列表

在不同的帧B中判断帧A中的子字符串,每个帧的大小不同

Python—转换日期:价目表到新行

应用指定的规则构建数组

如何在python tkinter中绑定键盘上的另一个回车?

在一个数据帧中,我如何才能发现每个行号是否出现在一列列表中?

如何在Polars中处理用户自定义函数的多行结果?

pyspark where子句可以在不存在的列上工作

是否将列表分割为2?