【问题标题】:Multiplying column and row vectors in Numpy在 Numpy 中将列向量和行向量相乘
【发布时间】:2015-05-23 15:52:30
【问题描述】:

我想将两个向量相乘,一列(即 (N+1)x1),一行(即 1x(N+1))得到 (N+1)x(N+1 ) 矩阵。我对 Numpy 还很陌生,但对 MATLAB 有一些经验,这是 MATLAB 中我想要的 Numpy 中的等效代码:

n = 0:N; 
xx = cos(pi*n/N)';
T = cos(acos(xx)*n');

在我尝试过的 Numpy 中:

import numpy as np
n = range(0,N+1)

pi = np.pi
xx = np.cos(np.multiply(pi / float(N), n))

xxa = np.asarray(xx)
na = np.asarray(n)
nd = np.transpose(na)

T = np.cos(np.multiply(np.arccos(xxa),nd))

在我注意到没有它的情况下,我添加了 asarray 行,Numpy 似乎将 xx 和 n 视为列表。 np.shape(n)np.shape(xx)np.shape(na)np.shape(xxa) 给出相同的结果:(100001L,)

【问题讨论】:

    标签: python matlab numpy


    【解决方案1】:

    np.multiply 只做逐个元素的乘法。你想要一个外部产品。使用np.outer

    np.outer(np.arccos(xxa), nd)
    

    【讨论】:

      【解决方案2】:

      如果您想使用类似于 MATLAB 的 NumPy,您必须确保您的数组具有正确的形状。您可以使用 arrayname.shape 检查任何 NumPy 数组的形状,因为您的数组 na 的形状为 (4,) 而不是 (4,1),所以 transpose 方法无效,multiply 计算点积。分别使用arrayname.reshape(N+1,1)arrayname.reshape(1,N+1) 转换你的数组:

      import numpy as np
      
      n = range(0,N+1)
      pi = np.pi
      xx = np.cos(np.multiply(pi / float(N), n))
      
      xxa = np.asarray(xx).reshape(N+1,1)
      na = np.asarray(n).reshape(N+1,1)
      nd = np.transpose(na)
      
      T = np.cos(np.multiply(np.arccos(xxa),nd))
      

      从 Python 3.5 开始,您可以使用 @ 运算符进行矩阵乘法。因此,获得与 MATLAB 非常相似的代码是一个简单的过程:

      import numpy as np
      
      n = np.arange(N + 1).reshape(N + 1, 1)   
      xx = np.cos(np.pi * n / N)
      T = np.cos(np.arccos(xx) @ n.T)
      

      这里n.T表示n的转置。

      【讨论】:

        猜你喜欢
        • 2013-04-04
        • 1970-01-01
        • 1970-01-01
        • 2020-09-03
        • 2013-07-11
        • 2016-07-22
        • 1970-01-01
        • 1970-01-01
        • 2016-10-24
        相关资源
        最近更新 更多