在NumPy中计算一维数组的乘积

16

我有两个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.

我想做什么。

c = a.dot(b)
c.shape = (10,21)

有什么想法如何做到这一点?我也试过转置函数,但它不起作用。

2个回答

40

我们先从两个数组开始:

>>> a
array([0, 1, 2, 3, 4])
>>> b
array([5, 6, 7])

无法对任一数组进行转置,因为它只有一维,没有需要转置的内容。相反,您需要添加一个新轴:

>>> b.T
array([5, 6, 7])
>>> b[:,None]
array([[5],
       [6],
       [7]])

为了让点积按照所示方式工作,您需要做一些复杂的操作:
>>> np.dot(a[:,None],b[None,:])
array([[ 0,  0,  0],
       [ 5,  6,  7],
       [10, 12, 14],
       [15, 18, 21],
       [20, 24, 28]])

您可以通过广播而不是点运算来实现:

a[:,None]*b

或者你可以简单地使用outer:

np.outer(a,b)

三种选项都返回相同的结果。

你可能还对这样的东西感兴趣,每个向量始终是一个二维数组:

np.dot(np.atleast_2d(a).T, np.atleast_2d(b))

我希望能够直接调用简单的.dot函数,因为现在我必须区分一维向量和矩阵。 - Cospel
1
@Cospel 看看我的更新答案,它可能对你有帮助。它所做的就是抽象出 if 语句,但它可以将你的问题简化为一行代码。 - Daniel

1

更简单的方式是像这样定义您的数组:

 >>>b = numpy.array([[1,2,3]]) 

然后您可以轻松地转置数组:
 >>>b.T
 array([[1],
        [2],
        [3]])

而且你也可以进行乘法操作:

 >>>b@b.T
 [[1 2 3]
 [2 4 6]
 [3 6 9]]

另一种方法是强制重塑您的向量,如下所示:
>>> b = numpy.array([1,2,3])
>>> b.reshape(1,3).T
array([[1],
       [2],
       [3]])

第三个例子是逐元素相乘,而不是点积。结果应该是[[14]],或者输入应该是>>>b*b.T - Solaxun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接