numpy中1d数组的乘法

Cos*_*pel 9 python numpy vector matrix

我有两个1d向量(在某些情况下它们也可以是2d矩阵).我找到了点积的点函数,但是如果我想将a.dot(b)与这些形状相乘:

a = [1,0.2,...]
a.shape = (10,)
b = [2.3,4,...]
b.shape = (21,)
a.dot(b) and I get ValueError: matrices not aligned.
Run Code Online (Sandbox Code Playgroud)

而且我想做

c = a.dot(b)
c.shape = (10,21)
Run Code Online (Sandbox Code Playgroud)

有什么想法怎么做?我试过转置功能,但它不起作用.

Dan*_*iel 28

让我们从两个数组开始:

>>> a
array([0, 1, 2, 3, 4])
>>> b
array([5, 6, 7])
Run Code Online (Sandbox Code Playgroud)

转置任一数组都不起作用,因为它只有1D-没有任何转置,而是需要添加一个新轴:

>>> b.T
array([5, 6, 7])
>>> b[:,None]
array([[5],
       [6],
       [7]])
Run Code Online (Sandbox Code Playgroud)

要让dot产品按图所示工作,您必须做一些令人费解的事情:

>>> np.dot(a[:,None],b[None,:])
array([[ 0,  0,  0],
       [ 5,  6,  7],
       [10, 12, 14],
       [15, 18, 21],
       [20, 24, 28]])
Run Code Online (Sandbox Code Playgroud)

你可以依靠广播而不是dot:

a[:,None]*b
Run Code Online (Sandbox Code Playgroud)

或者你可以简单地使用外部:

np.outer(a,b)
Run Code Online (Sandbox Code Playgroud)

所有三个选项都返回相同的结果.

你可能也对这样的事情感兴趣,这样每个矢量总是一个2D数组:

np.dot(np.atleast_2d(a).T, np.atleast_2d(b))
Run Code Online (Sandbox Code Playgroud)